www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Thread issue

reply Raynor <memphis007fr yahoo.fr> writes:
Hi, I try to make a client/server application but i have issues with 
threads.

import std.thread;
import std.socket;
import std.stdio;

class Class1
{
     Thread listeningThread;
     Socket listeningSocket;

     this()
     {
         listeningThread = new Thread(&Listen);
         listeningThread.start();
     }

     int Listen()
     {
         listeningSocket = new Socket(AddressFamily.INET, 
SocketType.STREAM, ProtocolType.TCP);
         writefln("socket created\n");
         return (0);
     }
}

void main()
{
     auto class1 = new Class1();
}

The results is a "Error: Unable to create socket"
I know its normal because my program quit imediatly but when the thread 
is destroyed it wouldn't make an error.

I know objects are destroyed by the GC in any order so i tried the 
manual method :

import std.thread;
import std.socket;
import std.stdio;

class Class1
{
     Thread listeningThread;
     Socket listeningSocket;

     this()
     {
         listeningThread = new Thread(&Listen);
         listeningThread.start();
     }

     ~this()
     {
         delete listeningThread;
     }

     int Listen()
     {
         listeningSocket = new Socket(AddressFamily.INET, 
SocketType.STREAM, ProtocolType.TCP);
         writefln("socket created\n");
         return (0);
     }
}

void main()
{
     auto class1 = new Class1();
}

But it does the same error.

Can you help me please?
Jan 07 2008
parent reply Sean Kelly <sean f4.ca> writes:
Raynor wrote:
 Hi, I try to make a client/server application but i have issues with 
 threads.
 
 import std.thread;
 import std.socket;
 import std.stdio;
 
 class Class1
 {
     Thread listeningThread;
     Socket listeningSocket;
 
     this()
     {
         listeningThread = new Thread(&Listen);
         listeningThread.start();

Try adding this. Phobos applications doesn't bother to wait for executing threads before terminating. Sean
Jan 07 2008
parent reply Raynor <memphis007fr yahoo.fr> writes:
Sean Kelly a écrit :
 Raynor wrote:
 Hi, I try to make a client/server application but i have issues with 
 threads.

 import std.thread;
 import std.socket;
 import std.stdio;

 class Class1
 {
     Thread listeningThread;
     Socket listeningSocket;

     this()
     {
         listeningThread = new Thread(&Listen);
         listeningThread.start();

Try adding this. Phobos applications doesn't bother to wait for executing threads before terminating. Sean

If i add listeningThread.wait();, my application is blocked.
Jan 09 2008
parent reply Sean Kelly <sean f4.ca> writes:
Raynor wrote:
 Sean Kelly a écrit :
 Raynor wrote:
 Hi, I try to make a client/server application but i have issues with 
 threads.

 import std.thread;
 import std.socket;
 import std.stdio;

 class Class1
 {
     Thread listeningThread;
     Socket listeningSocket;

     this()
     {
         listeningThread = new Thread(&Listen);
         listeningThread.start();

Try adding this. Phobos applications doesn't bother to wait for executing threads before terminating.

If i add listeningThread.wait();, my application is blocked.

If you don't wait for the thread then your application will leave main and exit, possibly without the thread ever running. This isn't the case in Tango however, as it has daemon and non-daemon threads, much like Java. Sean
Jan 09 2008
parent Raynor <memphis007fr yahoo.fr> writes:
Sean Kelly a écrit :
 Raynor wrote:
 Sean Kelly a écrit :
 Raynor wrote:
 Hi, I try to make a client/server application but i have issues with 
 threads.

 import std.thread;
 import std.socket;
 import std.stdio;

 class Class1
 {
     Thread listeningThread;
     Socket listeningSocket;

     this()
     {
         listeningThread = new Thread(&Listen);
         listeningThread.start();

Try adding this. Phobos applications doesn't bother to wait for executing threads before terminating.

If i add listeningThread.wait();, my application is blocked.

If you don't wait for the thread then your application will leave main and exit, possibly without the thread ever running. This isn't the case in Tango however, as it has daemon and non-daemon threads, much like Java. Sean

class Class1 { Thread listeningThread; Socket listeningSocket; this() { listeningThread = new Thread(&Listen); listeningThread.start(); listeningThread.wait(100); } int Listen() { listeningSocket = new Socket(AddressFamily.INET, SocketType.STREAM, ProtocolType.TCP); writefln("socket created\n"); return (0); } } void main() { auto class1 = new Class1(); } It works with listeningThread.wait(100). I dont understand why it makes an error if the application quit without the thread ever running. If the thread never run, normaly it woudn't throw a socket error.
Jan 09 2008