Ich habe hier eine Methode, die zum Versenden von einem String über
TCP einen TIdThread verwendet. Nachdem der Thread beendet wurde, gebe ich der Anwendung über entsprechende Events rückmeldung, so dass das Ergebnis in einem Memo angezeigt wird.
Delphi-Quellcode:
procedure TConnector.Send(const AMessage, AHost: String);
var p: integer;
begin
p := FPort;
with TSendThread.Create do
begin
FreeOnTerminate := true;
OnTerminate := ThreadTerminated;
FHost := AHost;
FMessage := AMessage;
FPort := p;
Start;
end;
end;
procedure TConnector.ThreadTerminated(ASender: TObject);
var s: String;
begin
s := TIdThread(ASender).TerminatingException;
if length(s) = 0 then
DoOnSent(TSendThread(ASender).FMessage, TSendThread(ASender).FHost)
else
DoOnSendError(TSendThread(ASender).FMessage, TSendThread(ASender).FHost, s);
end;
Hier noch der Code von TSendThread:
Delphi-Quellcode:
TSendThread = class(TIdThread)
private
FMessage, FHost: String;
FPort: integer;
public
procedure Run; override;
end;
procedure TSendThread.Run;
begin
with TIdTCPClient.Create(nil) do
try
Host := FHost;
Port := FPort;
ConnectTimeout := 1000;
Connect;
IOHandler.WriteLn(FMessage);
finally
Disconnect;
Free;
end;
Stop;
end;
Muss ich noch irgendwo einen Synchronize-Aufruf einbauen, oder geht das schon so? Denn die Behandlung der Ergebnise findet ja erst nach ende des Threads statt.
Bei einem Test funktioniert zwar alles problemlos, das war aber in einer sehr einfachen Test-Applikation und noch nicht im endgültigen Kontext.