![]() |
Ist das Thread-Sicher?
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:
Hier noch der Code von TSendThread:
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;
Delphi-Quellcode:
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.
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; Bei einem Test funktioniert zwar alles problemlos, das war aber in einer sehr einfachen Test-Applikation und noch nicht im endgültigen Kontext. |
AW: Ist das Thread-Sicher?
Zu den Indys kann ich mich nicht äußern, aber der Code im OnTerminate eines Threads wird bereits Synchronized aufgerufen.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:44 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz