Hi,
ich habe eine Klasse die bei Bedarf einen Thread zur Bearbeitung erstellt.
Falls der Thread sich beendet oder der Destructor der Klasse erreicht wird soll,
der Thread beendet und freigegeben werden.
Allerdings endet das ganze bei mir darin das in Endlos auf das Ende des Threads warte.
Code der Komponente :
Delphi-Quellcode:
constructor TTestComp.Create(AOwner: TComponent);
begin
inherited;
// ...
// Thread-Instanz
FCon2SvrThd := Nil;
end;
destructor TTestComp.Destroy;
begin
// cleanup everything
// ...
// End Thread if running
if FCon2SvrThd <> Nil then begin
FCon2SvrThd.Terminate;
While FCon2SvrThd <> Nil do begin
sleep(250);
end;
end;
end;
procedure TTestComp.OnConnection2SvrThreadEnded(Sender: TObject);
begin
FCon2SvrThd := Nil;
end;
procedure TTestComp.StartThread;
begin
FCon2SvrThd := TTwConnection2SvrThread.Create(self,FTcpCon);
FCon2SvrThd.OnThreadEnd := OnConnection2SvrThreadEnded;
FCon2SvrThd.Resume;
end;
Code des Threads :
Delphi-Quellcode:
constructor TTwConnection2SvrThread.Create(ParentComp : TTestComp; TcpCon: TIdTcpClient);
begin
inherited Create(true);
FreeOnTerminate := true;
OnTerminate := CleanUp;
fParent := ParentComp;
fTcpCon := TcpCon;
fSendCS := TCriticalSection.Create;
FOnThreadEnd := Nil;
end;
procedure TTwConnection2SvrThread.Cleanup(Sender: TObject);
begin
Disconnect;
FreeAndNil(fSendCS);
if Assigned(FOnThreadEnd) then
Synchronize(syncOnEnded);
end;
procedure TTwConnection2SvrThread.syncOnEnded;
begin
FOnThreadEnd(self);
end;
procedure TTwConnection2SvrThread.Execute;
begin
While (not Terminated) and (fTcpCon.Connected) do begin
// do some work ...
end;
end;
function TTwConnection2SvrThread.Disconnect: Boolean;
begin
if fTcpCon.Connected then begin
try
// Send Logout Command
fTcpCon.WriteLn('QUIT');
fTcpCon.Disconnect;
except {} end;
end;
result := not fTcpCon.Connected;
end;
Wo liegt der Hund begraben ? Jemand ne Idee ?
Danke und Gruß Data
Der Horizont vieler Menschen ist ein Kreis mit Radius Null, und das nennen sie ihren Standpunkt.