Newsgroups : Borland : borland.public.delphi.internet.winsock : 2006 Oct : Re: TIdTCPServer not shutting down
| Subject: | Re: TIdTCPServer not shutting down |
| Posted by: | "Roberto Meneghini" (rmeneghi..@separationsystems.com) |
| Date: | Thu, 5 Oct 2006 15:04:25 |
Thank you Gambit, I was not aware of the TIdThreadSafeStringList component.
I will take a look at it.
Regards,
Roberto
"Remy Lebeau (TeamB)" <no.spam@no.spam.com> wrote in message
news:45254732$1@newsgroups.borland.com...
>
> "Roberto Meneghini" <rmeneghini@separationsystems.com> wrote in message
> news:45250fb3$1@newsgroups.borland.com...
>
>> I'm using a class derived from TThread to log events in a TListView.
>
> Why are you using a thread for that? That is a lot of unnecessary
> overhead.
> I would suggest using a thread-safe container, such as a
> TIdThreadSafeStringList, and have the main thread check the container
> periodically, such as in a timer. This way, there is no potential
> deadlock
> areas. For example:
>
> var
> Log: TIdThreadSafeStringList;
>
> constructor TForm1.Create(AOwner: TComponent);
> begin
> inherited Create(AOwner);
> Log := TIdThreadSafeStringList.Create;
> end;
>
> destructor TForm1.Destroy;
> begin
> IdTCPServer1.Active := False;
> Log.Free;
> inherited Destroy;
> end;
>
> procedure TForm1.LogerTimerElapsed(Sender: TObject);
> var
> List: TStringList;
> begin
> List := Log.Lock;
> try
> // add contents of List to ListView as needed ...
> finally
> Log.Unlock;
> end;
> end;
>
> procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread);
> begin
> Log.Add('Client connected');
> end;
>
> procedure TForm1.IdTCPServer1Disconnect(AThread: TIdPeerThread);
> begin
> Log.Add('Client disconnected');
> end;
>
> procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
> begin
> //...
> Log.Add('Client did something');
> //...
> end;
>
>> What I think is happening is that when the server shuts down while a
> client
>> is still connected, it issues a OnDisconnect. At this point my log thread
> is
>> created and it tries to updated the TListView using the Synchronize
> method.
>> However, at this point the form is being destroyed and the thread never
>> terminates. Does this sound logical?
>
> Only if the OnDisconnect event is waiting for the log thread to terminate.
> In which case, yes it makes perfect sense. The main thread is not able to
> process the Synchronize() request during a shutdown, so the log thread
> becomes blocked, which then blocks the OnDisconnect event, which then
> blocks
> the client thread, which then blocks the server from fully shutting down.
>
>
> Gambit
none