![]() |
Ende eines Threads dem Main-Thread mitteilen
Hi Leute,
ich habe 3-5 Threads im Hintergrund laufen, diese Threads erledigen diverse Aufgaben im Background. Beendet werden die Threads indem ich für jeden Thread ein entsprechendes Events signalisiere ! Jetzt möchte ich gerne im Close meiner Main-Form, die verschiedenen Threads beenden(durch die jeweiligen Events) und möchte dann gerne von jedem einzelnen Thread eine Rückmeldung haben, das er sich erfolgreich beendet hat. Wie mache ich das am Geschicktesten ? Ich habe mir gedacht, das ich im OnTerminate des Threads eine WM_User + xyz Message an den Main-Thread schicke und beim Erhalt dieser Message eine Variable gleich true setze. Diese Variable prüfe ich nach Signalisierung des Events zum Beenden solange ab, bis Sie true ist. Oder gehts eleganter ? |
Re: Ende eines Threads dem Main-Thread mitteilen
naja, du könntest dem OnTerminate eine Methode des Hauptfensters zuweisen. Ich habs in der Regel so gemacht.
Delphi-Quellcode:
type
TMyThread = class(TThred) protected procedure Execute; override; public OnFertig: TNotifyEvent; end; [...] procedure TMyThread.Execute; begin //do something until terminted if Assigned(OnFertig) then OnFertig(Self); end; {============================================} [...] var LThread: TMyThread; begin LThread := TMYThread.Create(True); LThread.OnFertig := FThreadFertigProc; LThread.Resume; end; procedure TForm1.FThreadFertigProc; begin //das machen was halt passieren soll wenn der Thread fertig ist end; |
Re: Ende eines Threads dem Main-Thread mitteilen
Hi SirThornberry,
nice way, thx |
Re: Ende eines Threads dem Main-Thread mitteilen
Oder über SendMessage... Also über WParam und LParam liessen sich so noch Stati mitteilen wie Erfolgreich, Abbruch nach Fehler,... welche dann in einer MessageHandler-Routine im MainForm ausgewertet werden. Das dazu nötige Handle des MainForms könnte z.B. im Konstructor der Thread-Klasse übergeben werden.
Ich halte diesen Weg für ein wenig sicherer als ein Event. Denn was, wenn der Thread noch arbeitet, aber das MainForm bereits beim Beenden der App. zustört ist. Natürlich kann man einen solchen Fall verhindern, aber er ist doch theoretisch möglich... Grüsse! |
Re: Ende eines Threads dem Main-Thread mitteilen
Oder du nutzt
![]() |
Re: Ende eines Threads dem Main-Thread mitteilen
@DataCool
Meines Glaubens dürfte hier anstatt der 'WM_User + xyz Message' auch schon ein einfaches InterlockedExchange ausreichend sein. Damit lädst du eine solche Variable (die im Main-Thread jeweils einem dieser Threads zugeordnet ist) dann nämlich gleich direkt vom jeweiligen Thread aus. In deinem Main-Thread brauchst du dann diesbezüglich keine Messages mehr zu empfangen, sondern im Close-Eventhandler nur noch mehr (exakt genauso wie bisher auch) diese Variablen auszuchecken. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:37 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