![]() |
Delphi-Version: 6
Programm schließen und Thread beenden (ohne .WaitFor) - alles "sauber"?
Hi!
Also, ich habe einen Arbeitsthread am laufen. Wenn der Benutzer das Hauptfenster schließt, soll dieser beendet werden - und zwar ohne merkliche Verzögerung! Dazu schreibe ich einfach ein MyThread.Terminate in das OnClose-Event des Hauptfensters. Es gilt: 1. MyThread.FreeOnTerminate = True 2. In der Execute-Methode von TMyThread wird auf .Terminate foldendermaßen reagiert:
Delphi-Quellcode:
3. Im OnClose/OnCloseQuery des Hauptfensters soll ausdrücklich NICHT
if Terminated then
begin CoUninitialize; Exit; end;
Code:
auftauchen, weil CoUninitialize teilweise recht lange braucht und .WaitFor somit zum zeitweisen augenscheinlichen Einfrieren des Hauptfensters führen würde. (Hier eine Lösung mit ner Schleife "while MyThreadRunning do Application.ProcessMessages" kommt auch nicht in Frage, weil sich das Fenster ja ohne große Verzögerung schließen soll)
MyThread.WaitFor
Nun gibt es in meinem Kopf zwei mögliche Szenarien, was passiert, wenn der Benutzer das Hauptfenster schließt. Das erste in folgendes: 1. Benutzer gibt Schließbefehl 2. Hauptthread signalisiert dem Arbeitsthread das .Terminate 3a. Hauptfenster schließt sich, aber das Programm bleibt am Leben, weil der Arbeitsthread noch läuft 3b. Arbeitsthread führt noch das CoUninitialize aus und zerstört sich danach selbst 4. Anwendung erkennt, dass der Arbeitsthread terminiert hat und beendet sich komplett Das wäre die "gute" Variante. Die andere denkbare Möglichkeit wäre die: 1. " 2. " 3. Hauptfenster schließt sich, wobei die Anwendung komplett beendet wird, ohne Rücksicht darauf, dass der Arbeitsthread noch läuft Ob dabei noch rechtzeitig CoUninitialize aufgerufen wird, kann man nicht sagen. Und was passiert, wenn es aufgerufen wurde, aber noch nicht fertig ist, erst recht nicht. Und ob es wirklich schadet, wenn das CoUninitialize am Ende des Programms nicht aufgerufen wird, weiß ich übrigens auch nicht (d.h. ob die COM Library beim Ende des Prozesses automatisch freigegeben wird). Es wäre super, wenn jemand ein wenig Klarheit in die Sache bringen könnte. Die Frage ist übrigens eng hiermit verknüpft: ![]() Beste Grüße! Robert |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:09 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 by Thomas Breitkreuz