www.digitalmars.com         C & C++   DMDScript  

digitalmars.D - threads: Waiting for event & shutdown socket

reply Benjamin Schulte <Aldoric gmx.de> writes:
Hi!

Just two other problems - now coming with threads.

First:
Is there something like the WinAPI method 'WaitForSingleObject'?

Some methods like
while( threadEventIsSet ) { Sleep(10); }
is not the best solution I guess.


Well, and another problem.
I've created a server socket in a thread. I set blocking to 'true' and now I'm
waiting for connections in "accept()". Well, however it's possible that the
thread should be closed while it's accepting. How can I cancel that
waiting-for-users?
May 30 2007
parent reply Sean Kelly <sean f4.ca> writes:
Benjamin Schulte wrote:
 Hi!
 
 Just two other problems - now coming with threads.
 
 First:
 Is there something like the WinAPI method 'WaitForSingleObject'?

Depends. Thread.sleep() in Tango calls SleepEx(INFINITE,TRUE) on Win32, which will be interrupted when IOCP events occur and such. For something more general I think you will probably want something like a condition variable.
 I've created a server socket in a thread. I set blocking to 'true' and now I'm
waiting for connections in "accept()". Well, however it's possible that the
thread should be closed while it's accepting. How can I cancel that
waiting-for-users?

Why would the thread be closed while it's accepting? Or did you mean the socket would be closed? Sean
May 30 2007
parent reply Benjamin Schulte <Aldoric gmx.de> writes:
Well, for question 1: I want to have the thread to be paused until I set a
variable to TRUE (for example). Don't exactly know how the SleepEx method
should work. And as soon as I use winAPI methods, I also could use
WaitForSingleObject.

Question 2:

I have the methods:

startServer( )
which creates a thread that runs the server and handles everything there.

closeServer( )
this should KILL the thread. Wherever it is at the moment.


the thread itself just has a structure like (it's a one-client-server, cause I
never would need more in this case):

- create socket
- bind socket and listen

while( true )
{
  - accept
  - handle messages
}



And for the case, no user connected to the server it will block at "accept".
When I call 'closeServer' it should close the thread, even if it's in the
accept method.

Hopefully I was able to explain it a bit exactlier now. I know, I have a bad
english ;)
May 30 2007
parent reply Regan Heath <regan netmail.co.nz> writes:
Benjamin Schulte Wrote:
 Question 2:
 
 I have the methods:
 
 startServer( )
 which creates a thread that runs the server and handles everything there.
 
 closeServer( )
 this should KILL the thread. Wherever it is at the moment.
 
 
 the thread itself just has a structure like (it's a one-client-server, cause I
never would need more in this case):
 
 - create socket
 - bind socket and listen
 
 while( true )
 {
   - accept
   - handle messages
 }
 
 
 
 And for the case, no user connected to the server it will block at "accept".
When I call 'closeServer' it should close the thread, even if it's in the
accept method.
 
 Hopefully I was able to explain it a bit exactlier now. I know, I have a bad
english ;)

You make the socket non-blocking and change your loop to something like: while(true) { try { - accept - handle messages } catch(SocketAcceptException e) { Sleep(1); //prevent a hard-loop when there is no socket to accept } } Regan
May 30 2007
parent Regan Heath <regan netmail.co.nz> writes:
Regan Heath Wrote:
 Benjamin Schulte Wrote:
 Question 2:
 
 I have the methods:
 
 startServer( )
 which creates a thread that runs the server and handles everything there.
 
 closeServer( )
 this should KILL the thread. Wherever it is at the moment.
 
 
 the thread itself just has a structure like (it's a one-client-server, cause I
never would need more in this case):
 
 - create socket
 - bind socket and listen
 
 while( true )
 {
   - accept
   - handle messages
 }
 
 
 
 And for the case, no user connected to the server it will block at "accept".
When I call 'closeServer' it should close the thread, even if it's in the
accept method.
 
 Hopefully I was able to explain it a bit exactlier now. I know, I have a bad
english ;)

You make the socket non-blocking and change your loop to something like: while(true) { try { - accept - handle messages } catch(SocketAcceptException e) { Sleep(1); //prevent a hard-loop when there is no socket to accept } }

Slight correction, your loop should be while(!stopping) ..etc. and closeServer should set stopping = true; and then wait for the thread to exit normally with join(); Regan
May 30 2007