Hallo,
in einem eigenständigen Thread verwende ich eine Ableitung von TIdTCPClient.
Der Thread selbst durchläuft in seiner Execute Methode eine Schleife
Delphi-Quellcode:
procedure TClientReader.Execute;
var
LReadString : AnsiString;
begin
while not Terminated
do
begin
sleep(10);
try
if Assigned(FClient)
and Assigned(FClient.IOHandler)
and FClient.Connected
then
try
FClient.IOHandler.ReadTimeout:=1000;
//Test
LReadString:= FClient.IOHandler.ReadLn;
//Hier hängt sich das Programm einfach auf
if(Length(Trim(LReadString))>0)
then
begin
if Assigned(FClient.ReaderEvent)
then
begin
FClient.ReaderEvent(LReadString);
end;
end;
except
on e : EIdClosedSocket
do SNLogger.Log('
TClientReader.Execute:EIdClosedSocket:'+e.ClassType.ClassName+'
:'+e.
message);
on e : EIdReadTimeout
do SNLogger.Log('
TClientReader.Execute:EIdReadTimeout:'+e.ClassType.ClassName+'
:'+e.
message);
on e : EIdException
do SNLogger.Log('
TClientReader.Execute:EIdException:'+e.ClassType.ClassName+'
:'+e.
message);
on e :
exception do SNLogger.Log('
TClientReader.Execute:Exception:'+e.ClassType.ClassName+'
:'+e.
message);
end;
except
on e :
exception do
begin
SNLogger.Log('
TClientReader.Execute:'+e.ClassType.ClassName+'
:'+e.
Message);
exit;
end;
end;
end;
An der markierten Stelle hängt sich das Programm einfach auf, wenn ich die Zeile auskommentier funktioniert es perfekt.
Es kommt keine
Exception
Das Programm hängt sich auch nicht bei jedem Durchlauf auf, sondern erst nach einiger Zeit.
Ich habe wie ihr seht ein Timeout probiert, jedoch ohne Erfolg.
Jetzt ist mir eingefallen, dass TIdAntiFreeze für solche Fälle nützlich sein kann und ich hab eins auf das Formular der
Unit gezogen, in der dieser Thread verwendet wird, allerdings auch ohne Erfolg.
Ich bin mir jetzt nicht sicher wie das TIdAntiFreeze arbeitet, ob ich das in diesem Fall woanders einfügen muss.
Habt Ihr eine Idee warum sich das Programm da aufhängt?
Es hängt sich auch nur unter Windows XP auf, unter Windows 7 hatte ich bisher keine Probleme.