AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Frage zu Thread mit FreeOnTerminate

Ein Thema von iphi · begonnen am 28. Apr 2021 · letzter Beitrag vom 29. Apr 2021
Antwort Antwort
Der schöne Günther

Registriert seit: 6. Mär 2013
6.222 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

AW: Frage zu Thread mit FreeOnTerminate

  Alt 28. Apr 2021, 08:23
Wie kann ich feststellen, ob das Threadobjekt noch lebt?
Das FreeOnTerminate eben nicht verwenden.

Ich habe aber den Eindruck, dass MyThread nicht auf NIL gesetzt wird, wenn der Thread sich selbst auflöst
Richtig. Der Thread kann selbst auch gar nicht wissen, welche Variablen auf ihn zeigen.

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()).
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.752 Beiträge
 
Delphi 12 Athens
 
#2

AW: Frage zu Thread mit FreeOnTerminate

  Alt 28. Apr 2021, 08:30
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)
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (28. Apr 2021 um 08:33 Uhr)
  Mit Zitat antworten Zitat
iphi

Registriert seit: 13. Feb 2009
266 Beiträge
 
Delphi 7 Personal
 
#3

AW: Frage zu Thread mit FreeOnTerminate

  Alt 28. Apr 2021, 08:33
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?

Geändert von iphi (28. Apr 2021 um 08:35 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.752 Beiträge
 
Delphi 12 Athens
 
#4

AW: Frage zu Thread mit FreeOnTerminate

  Alt 28. Apr 2021, 09:08
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.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (28. Apr 2021 um 09:14 Uhr)
  Mit Zitat antworten Zitat
shebang

Registriert seit: 7. Feb 2020
152 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Frage zu Thread mit FreeOnTerminate

  Alt 29. Apr 2021, 13:25
Wenn der Thread noch läuft, wenn das Hauptprogramm beendet wird, dann kommts zum Crash.
Wie fängt man sowas ab?
Du kannst im Thread an entsprechender Stelle prüfen, ob dein Hauptprogramm gerade beendet wird und darauf reagieren. Im Hauptprogramm müstest du dann allerdings warten, bis alle Threads beendet sind.
  Mit Zitat antworten Zitat
Benutzerbild von TigerLilly
TigerLilly

Registriert seit: 24. Mai 2017
Ort: Wien, Österreich
1.258 Beiträge
 
Delphi 12 Athens
 
#6

AW: Frage zu Thread mit FreeOnTerminate

  Alt 29. Apr 2021, 13:53
Im Hauptprogramm müstest du dann allerdings warten, bis alle Threads beendet sind.
Das ist allerdings nicht so einfach.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.752 Beiträge
 
Delphi 12 Athens
 
#7

AW: Frage zu Thread mit FreeOnTerminate

  Alt 29. Apr 2021, 13:58
Das ist allerdings nicht so einfach.
Jo, "FreeOnTerminate", also kann/darf man nicht von außen prüfen.
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.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (29. Apr 2021 um 14:05 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Frage zu Thread mit FreeOnTerminate

  Alt 29. Apr 2021, 14:10
Was ich bis jetzt alles gelesen habe ist etwas verwirrend.
Ich bin eh auf Kriegsfuß mit Delphis TThread, nutze nur noch Winapi MSDN-Library durchsuchenCreateThread, da gibt es all diese Probleme nicht.

//edit
da kann ich auch abfragen ob mein thread handle noch existiert ohne irgendwelche probleme zu verursachen.
Gruß vom KodeZwerg

Geändert von KodeZwerg (29. Apr 2021 um 14:15 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.752 Beiträge
 
Delphi 12 Athens
 
#9

AW: Frage zu Thread mit FreeOnTerminate

  Alt 29. Apr 2021, 14:21
Bei TThread kann man das Handle oder die ThreadID auch prüfen,
aber durch FreeOnTerminate gibt sich der Thread selbst frei.

Und wenn dann in der zwischenzeit ein anderer Thread (egal ob RTL oder WinAPI) gestartet ist und die gleiche ThreadID/Handle hat, dann bringt dir das Prüfen darauf garnichts, weil es eben sein kann, dass es nicht "der" Thread ist.

[edit]
Man könnte das Thread-Handle "dupplizieren", um damit prüfen zu können.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:42 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