Ik heb een afgeleide van TIdTCPClient (Indy) gemaakt welke een thread aanmaakt die controleert of er nieuwe data beschikbaar is. De thread wordt pas aangemaakt als er verbinding is gemaakt en wordt weer vrijgegeven als de verbinding wordt verbroken.
De disconnect van de TTCPClient ziet er als volgt uit:
Nou is het in sommige gevallen (dus lang niet altijd) zo dat als je disconnect aanroept en gelijk free dan is de thread nog niet helemaal klaar. Deze geeft dus een AV (op adres 000000...). Dit klopt wel omdat het TCPClient object waar de thread naar kijkt al is vrijgegeven.
De execute van de thread zit er als volt uit:
Ik heb getest of mijn theorie klopt door een sleep(500) te zetten tussen TCPClient.Disconnect en TCPClient.Free, en dan gaat het inderdaad wel goed (een sleep(1) is al genoeg (!))
Heeft iemand een idee hoe ik dit goed krijg zodat hij wacht totdat de thread klaar is en dan pas destroy doet?
Heb het probleem is een zeer simpel project kunnen vatten: Delphi 7 source.
De disconnect van de TTCPClient ziet er als volgt uit:
code:
1
2
3
4
5
| procedure TTCPClient.Disconnect; begin if Assigned(FTCPClientReader) then FTCPClientReader.Terminate; inherited Disconnect; end; |
Nou is het in sommige gevallen (dus lang niet altijd) zo dat als je disconnect aanroept en gelijk free dan is de thread nog niet helemaal klaar. Deze geeft dus een AV (op adres 000000...). Dit klopt wel omdat het TCPClient object waar de thread naar kijkt al is vrijgegeven.
De execute van de thread zit er als volt uit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| procedure TTCPClientReader.Execute;
var
InpSize: Integer;
begin
while (not Terminated) and (FTCPClient.Connected) do
begin
try
InpSize := FTCPClient.InputBuffer.Size;
if (InpSize = 0) or (InpSize = InpLastSize) then
InpLastSize := InpSize + FTCPClient.ReadFromStack(False, -1, False);
if FTCPClient.Connected then
Synchronize(FTCPClient.DoDataAvailableEvent);
except
Terminate;
end;
end;
end; |
Ik heb getest of mijn theorie klopt door een sleep(500) te zetten tussen TCPClient.Disconnect en TCPClient.Free, en dan gaat het inderdaad wel goed (een sleep(1) is al genoeg (!))
Heeft iemand een idee hoe ik dit goed krijg zodat hij wacht totdat de thread klaar is en dan pas destroy doet?
Heb het probleem is een zeer simpel project kunnen vatten: Delphi 7 source.
[ Voor 5% gewijzigd door jelmervos op 05-02-2003 22:14 ]
"The shell stopped unexpectedly and Explorer.exe was restarted."