Soo, es funktioniert jetzt
Ein weiteres Problem was sich gestellt hat ist folgendes:
Ich möchte ja einen TCPClient im Thread verbinden welcher danach im Programm selbst verwendet werden soll.
Ergo muss ich das selbe Objekt nehmen. Wenn ich nun das Objekt im Thread am ende Free'e ist es ja weg. Wenn ich es nicht Free'e habe ich einen potentiellen Speicherfresser.
Meine Lösung sieht nun wie folgt aus:
Delphi-Quellcode:
procedure TConnectThread.Execute;
begin
Priority:=tpLower;
FConnected:=False;
try
FTCP.Connect(FHost,FPort);
except
end;
if FTimeOut
then FTCP.Free;
FConnected:=True;
end;
procedure TChatClient.Connect(Host:
String; Port: Integer);
var CT: TConnectThread;
T: Cardinal;
begin
if Connected
then Exit;
//Schon Connected -> Raus
CT:=TConnectThread.Create(True);
CT.TCP:=TIdTCPClient.Create;
//Init
CT.Host:=Host;
CT.Port:=Port;
CT.TimeOut:=False;
CT.FreeOnTerminate:=True;
T:=GetTickCount+5000;
//5 Sek warten
CT.Resume;
while (
not CT.Terminated)
do
begin //Thread läuft noch
FOnSleep;
//Warten
if (GetTickCount>T)
or (CT.Connected)
then Break;
Sleep(50);
//und nochmal warten
end;
if CT.Connected
then
begin //Verbunden -> Alles OK -> Client übernehmen
Fidtcp:=CT.TCP;
end
else //Nicht verbunden -> Alles Doof -> Client killen & Exception werfen
begin
CT.TimeOut:=True;
raise EConnectException.Create('
');
end;
end;