Hi,
ich sende mit einem TIdTCPClient etwas zu einem TIdTCPServer und will auf dessen Anwort warten.
Zu diesem Zweck heba ich eine Thread der beim TIdTCPClient.Connected erzeugt wird und beim TIdTCPClient.Disconnected wieder terminiert wird.
(Delphi 10.3 +
Indy 10)
Delphi-Quellcode:
unit uIdTCPClientThread;
interface
uses System.Classes, IdBaseComponent, IdComponent,
IdTCPConnection, IdTCPClient, IdCmdTCPClient;
type
TDataEvent =
procedure(
const Data:
string)
of object;
TReadingThread =
class(TThread)
private
FClient: TIdTCPClient;
FData:
string;
FOnData: TDataEvent;
procedure DataReceived;
protected
procedure Execute;
override;
public
constructor Create(AClient: TIdTCPClient);
reintroduce;
property OnData: TDataEvent
read FOnData
write FOnData;
end;
implementation
constructor TReadingThread.Create(AClient: TIdTCPClient);
begin
inherited Create(True);
FClient := AClient;
end;
procedure TReadingThread.Execute;
begin
while not Terminated
do
begin
if not FClient.Connected
then
begin
self.Terminate;
exit;
end;
FData := FClient.IOHandler.ReadLn;
if (FData <> '
')
and Assigned(FOnData)
then
Synchronize(DataReceived);
end;
end;
procedure TReadingThread.DataReceived;
begin
if Assigned(FOnData)
then
FOnData(FData);
end;
end.
In der Procedure Execute kommt es in der Zeile "FData := FClient.IOHandler.ReadLn;" zu eine EIdconnClosedGracefully, obwohl kurz darüber FClient.Connected noch True sein muss.
Im Mainthread wird nix disconnected.
Woran kann das liegen. Gibt es sowas wie Autodisconnect im Server oder client?