[twsocket] TWSocketThrdServer stuck in destructor loop when killing threads

2007-10-04 Thread [EMAIL PROTECTED]
Hello:
   I'm having a problem with the TWSocketThrdServer.
 My application has a worker thread that contains a
TWSocketThrdServer member to handle all incoming
requests.  When the main thread finishes, it sends a
WM_QUIT message to the worker thread, which then
finishes and frees the TWSocketThrdServer.  However,
if there are clients connected, the thrdserver stalls
in its destructor, while waiting for all its threads
to finish.

   It only loops forever when there are clients
connected and the worker thread is terminated.  But
if there are no clients connected, it works fine. 
Can someone offer any help? Most likely I'm doing
something wrong. (Below is an example of my code.)

   Also, I need to be able to terminate the entire
application if something goes wrong while processing
clients.  What is the best way to do this? Should I
post a message to the main thread from a
TWSocketThrdServer event in the worker thread?

Thanks!
dZ.


My code is somewhat like this (this is very much
simplified):

Interface

Type
  TServerThrd = Class(TThread)
Private
  FSocketSrv: TWSocketThrdServer;
Public
  Constructor Create; Reintroduce;
  Destructor Destroy; Override;
  Procedure Execute; Override;
End;

  TQApp = Class(TObject)
Private
  FServerThrd : TServerThrd;
Public
  Constructor Create;
  Destructor Destroy; Override;
End;

Implementation

{ TQApp }
Constructor TQApp.Create;
Begin
  FServerThrd := TServerThrd.Create(False);
End;

Destructor TQApp.Destroy
Begin
  Try
Try
 
PostThreadMessage(FServerThrd.ThreadID,WM_QUIT,0,0);
Finally
  FServerThrd.WaitFor;
  FServerThrd.Free;
End;
  Finally
Inherited Destroy;
  End;
End;

{ TServerThrd }
Constructor TServerThrd.Create;
Begin
  Inherited Create(True);
End;

Destructor TServerThrd.Destroy;
Begin
  Try
If Assigned(FSocketSrv) Then Begin
  FSocketSrv.Free; // -- HERE! (waits forever)
End;
  Finally
Inherited Destroy;
  End;
End;

Procedure TServerThrd.Execute;
Begin
  Try
FSocketSrv := TWSocketThrdServer.Create(Nil);
FSocketSrv.Listen();

FSocketSrv.MessageLoop;
  Finally
// do other cleanup
  End;
End;



-- 
To unsubscribe or change your settings for TWSocket mailing list
please goto http://www.elists.org/mailman/listinfo/twsocket
Visit our website at http://www.overbyte.be


Re: [twsocket] TWSocketThrdServer stuck in destructor loop when killing threads

2007-10-04 Thread Wilfried Mestdagh
Hello dz,

Change this. Its from top of my head so can be syntax errors. You have
to move the destroy of the server also in the Execute mehod:

 Destructor TServerThrd.Destroy;
 Begin
   Try
   
 // this must in the Execute method
// If Assigned(FSocketSrv) Then Begin
//   FSocketSrv.Free; // -- HERE! (waits forever)
// End;

   Finally
 Inherited Destroy;
   End;
 End;

 Procedure TServerThrd.Execute;
 Begin
   Try
 FSocketSrv := TWSocketThrdServer.Create(Nil);
 FSocketSrv.Listen();
 FSocketSrv.MessageLoop;
   Finally

 // Add
 FSocketSrv.Free;

   End;
 End;

---
Rgds, Wilfried [TeamICS]
http://www.overbyte.be/eng/overbyte/teamics.html
http://www.mestdagh.biz

Thursday, October 4, 2007, 18:57, [EMAIL PROTECTED] wrote:

 Hello:
I'm having a problem with the TWSocketThrdServer.
  My application has a worker thread that contains a
 TWSocketThrdServer member to handle all incoming
 requests.  When the main thread finishes, it sends a
 WM_QUIT message to the worker thread, which then
 finishes and frees the TWSocketThrdServer.  However,
 if there are clients connected, the thrdserver stalls
 in its destructor, while waiting for all its threads
 to finish.

It only loops forever when there are clients
 connected and the worker thread is terminated.  But
 if there are no clients connected, it works fine. 
 Can someone offer any help? Most likely I'm doing
 something wrong. (Below is an example of my code.)

Also, I need to be able to terminate the entire
 application if something goes wrong while processing
 clients.  What is the best way to do this? Should I
 post a message to the main thread from a
 TWSocketThrdServer event in the worker thread?

 Thanks!
 dZ.


 My code is somewhat like this (this is very much
 simplified):

 Interface

 Type
   TServerThrd = Class(TThread)
 Private
   FSocketSrv: TWSocketThrdServer;
 Public
   Constructor Create; Reintroduce;
   Destructor Destroy; Override;
   Procedure Execute; Override;
 End;

   TQApp = Class(TObject)
 Private
   FServerThrd : TServerThrd;
 Public
   Constructor Create;
   Destructor Destroy; Override;
 End;

 Implementation

 { TQApp }
 Constructor TQApp.Create;
 Begin
   FServerThrd := TServerThrd.Create(False);
 End;

 Destructor TQApp.Destroy
 Begin
   Try
 Try
 
 PostThreadMessage(FServerThrd.ThreadID,WM_QUIT,0,0);
 Finally
   FServerThrd.WaitFor;
   FServerThrd.Free;
 End;
   Finally
 Inherited Destroy;
   End;
 End;

 { TServerThrd }
 Constructor TServerThrd.Create;
 Begin
   Inherited Create(True);
 End;

 Destructor TServerThrd.Destroy;
 Begin
   Try
 If Assigned(FSocketSrv) Then Begin
   FSocketSrv.Free; // -- HERE! (waits forever)
 End;
   Finally
 Inherited Destroy;
   End;
 End;

 Procedure TServerThrd.Execute;
 Begin
   Try
 FSocketSrv := TWSocketThrdServer.Create(Nil);
 FSocketSrv.Listen();

 FSocketSrv.MessageLoop;
   Finally
 // do other cleanup
   End;
 End;




-- 
To unsubscribe or change your settings for TWSocket mailing list
please goto http://www.elists.org/mailman/listinfo/twsocket
Visit our website at http://www.overbyte.be