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
Seite 1 von 2  1 2      
iphi

Registriert seit: 13. Feb 2009
262 Beiträge
 
Delphi 7 Personal
 
#1

Frage zu Thread mit FreeOnTerminate

  Alt 28. Apr 2021, 09:17
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:

MyThread:=TMyThread.Create; Wie kann ich feststellen, ob das Threadobjekt noch lebt?

a)
if assigned(MyThread) then ... Ich habe aber den Eindruck, dass MyThread nicht auf NIL gesetzt wird, wenn der Thread sich selbst auflöst.

b) Ich könnte im Thread eine Variable Running anlegen:
if MyThread.Running then ... Nach meinem Verständnis gibt es aber nach Beendigung des Threads das Objekt MyThread nicht mehr im Speicher. => Zugriffsverletzung

Wie mache ichs richtig?
  Mit Zitat antworten Zitat
Der schöne Günther

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

AW: Frage zu Thread mit FreeOnTerminate

  Alt 28. Apr 2021, 09: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 Gandalf2265
Gandalf2265

Registriert seit: 24. Mai 2009
Ort: Laurenburg (Unterkante Westerwald)
16 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Frage zu Thread mit FreeOnTerminate

  Alt 28. Apr 2021, 09:28
ungetestet, sollte aber glaube ich gehen:
  • Eine eigene Methode im Thread für OnTerminate bauen
  • darin dann mit Synchronize in die Thread erzeugende Unit einen Wert schreiben
Dann wäre der Wert als Signal da wenn der Thread beendet ist.
Thorsten Maxeiner
allways change a running system
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Frage zu Thread mit FreeOnTerminate

  Alt 28. Apr 2021, 09: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)
$2B or not $2B

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

Registriert seit: 13. Feb 2009
262 Beiträge
 
Delphi 7 Personal
 
#5

AW: Frage zu Thread mit FreeOnTerminate

  Alt 28. Apr 2021, 09: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 09:35 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von dummzeuch
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
1.623 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

AW: Frage zu Thread mit FreeOnTerminate

  Alt 28. Apr 2021, 09:37
ungetestet, sollte aber glaube ich gehen:
  • Eine eigene Methode im Thread für OnTerminate bauen
  • darin dann mit Synchronize in die Thread erzeugende Unit einen Wert schreiben
Dann wäre der Wert als Signal da wenn der Thread beendet ist.
Synchronize ist nur notwendig, wenn in der Methode auf die VCL zugegriffen wird. Wenn man also nur z.B. eine Boolean-Variable setzen will (oder einen Pointer auf NIL), kann man sich Synchronize sparen.
Thomas Mueller
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Frage zu Thread mit FreeOnTerminate

  Alt 28. Apr 2021, 10: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.
$2B or not $2B

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

Registriert seit: 7. Feb 2020
131 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Frage zu Thread mit FreeOnTerminate

  Alt 29. Apr 2021, 14: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
TigerLilly

Registriert seit: 24. Mai 2017
Ort: Wien, Österreich
1.211 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Frage zu Thread mit FreeOnTerminate

  Alt 29. Apr 2021, 14: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.184 Beiträge
 
Delphi 12 Athens
 
#10

AW: Frage zu Thread mit FreeOnTerminate

  Alt 29. Apr 2021, 14: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.
$2B or not $2B

Geändert von himitsu (29. Apr 2021 um 15:05 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      

 

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 12:17 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz