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

Reply via email to