![]() |
Frage zu Thread mit FreeOnTerminate
Hallo,
ich habe ein Threadobjekt, das sofort nach Create losläuft, etwas macht und sich dann wegen FreeOnTerminate selbst auflöst, wenn es fertig ist. Ich erzeuge mein Threadobjekt so:
Delphi-Quellcode:
Wie kann ich feststellen, ob das Threadobjekt noch lebt?
MyThread:=TMyThread.Create;
a)
Delphi-Quellcode:
Ich habe aber den Eindruck, dass MyThread nicht auf NIL gesetzt wird, wenn der Thread sich selbst auflöst.
if assigned(MyThread) then ...
b) Ich könnte im Thread eine Variable Running anlegen:
Delphi-Quellcode:
Nach meinem Verständnis gibt es aber nach Beendigung des Threads das Objekt MyThread nicht mehr im Speicher. => Zugriffsverletzung
if MyThread.Running then ...
Wie mache ichs richtig? |
AW: Frage zu Thread mit FreeOnTerminate
Zitat:
Delphi-Quellcode:
eben nicht verwenden.
FreeOnTerminate
Zitat:
Du musst dich entscheiden - Entweder du machst FreeOnTerminate, das heißt es ist Fire&Forget: Du startest den Thread und danach fasst du ihn nie wieder an. Deshalb macht es auch keinen Sinn ihn dann überhaupt in einer Variable zu speichern. Oder du nutzt eben kein FreeOnTerminate, musst nachschauen wann er zu Ende ist, und wenn du ihn nicht mehr brauchst, gibst du ihn frei (.Destroy()). |
AW: Frage zu Thread mit FreeOnTerminate
ungetestet, sollte aber glaube ich gehen:
|
AW: Frage zu Thread mit FreeOnTerminate
von Außen kannst darfst du es garnicht feststellen, da die Variable per-se ungültig ist, weil der Thread schon weg sein könnte.
Also im Grunde darfst du den erstellten Thread garnicht erst in einer Variable speichern. Das Selbe gilt auch für TThread.CreateAnonymus, welches ja auch FreeOnTerminate nutzt. Dein Thread kann aber über eine "globale" Variable oder über ein Event nach außen durchgeben, dass er fertig ist. Also du mußt das dann im Code rausgeben. (entweder im Destroy des Threads oder Try-Finally im Execute) |
AW: Frage zu Thread mit FreeOnTerminate
OnTerminate-Methode ist eine gute Idee!
Vielen Dank für die Aufklärung und Eure Hilfe! Noch eine Verständnisfrage: Macht FreeOnTerminate dann überhaupt irgendwann einen Sinn? Wenn der Thread noch läuft, wenn das Hauptprogramm beendet wird, dann kommts zum Crash. Wie fängt man sowas ab? |
AW: Frage zu Thread mit FreeOnTerminate
Zitat:
|
AW: Frage zu Thread mit FreeOnTerminate
wenn du keine eigenes try-except im Execute hast, dann ist OnTerminatee auch die Stelle wo du self.FatalException oder war's .FatalError (kannst das einfach nach "Exception casten" )prüfen solltest.
Die VCL zeigt ja Exceptions an, aber TThread macht das nicht von sich aus. Der fängt es nur ab, da wenn eine Exception bis zum Windows durchrauscht der ganze Prozess beendet wird. |
AW: Frage zu Thread mit FreeOnTerminate
Zitat:
|
AW: Frage zu Thread mit FreeOnTerminate
Zitat:
|
AW: Frage zu Thread mit FreeOnTerminate
Zitat:
Da kann man nur in einer "globalen" Variable/Liste seine aktiven Threads "zählen" und dann warten, bis der Zähler/Liste 0 ist (was vom Thread aus gesetzt wird, wenn er sich beendet). Die RTL führt am Ende zwar ein Halt aus, was den ganzen Prozess beendet, also auch Threads "abschießt" (damit Windows eben nicht wartet, bis alle Threads beendet sind, inkl. dem Hauptthread), aber wenn bis dahin beim Beenden die Threads z.B. auf die RTL/VCL zugreifen, aber die Finalization der Units bereits durch sind, auch der Speichermanager (FastMM) sich beendet hat, dann kann es natürlich knallen, drum sollte man oftmals eben auf seine Threads warten, bevor das Beenden des Programms weiterläuft. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:13 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