Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

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

AW: TThread: Wie frei geben? Bekomme beim Beenden Memory Leak

  Alt 4. Mai 2020, 00:02
Wenn sich dein Programm beendet, dann mußt du auch den Thread beenden,
oder es muß sicherestellt sein, dass er nur kurz läuft und schon vor dem Programmende sich beendet und freigegeben hat.


Man könnte z.B. im Thread aus Application.Terminated prüfen, bzw. dem Thread von außen ein Signal (Thread.Terminate oder ein Event oder eine Variable) schicken
und dann ein bissl warten, bis der Thread aus ist, denn wenn der Thread noch läuft, während der Hauptthread anfängt den Speichermanager aufzuräumen/beenden, dann hast immernoch ein Speicherleck.


Zitat:
Delphi-Quellcode:
PROCEDURE my_HelpFileThread.Execute;
BEGIN
  TRY
  // hier meine Abarbeitung der Aufgabe
  FINALLY
    Terminate;
  END;
END;
Wenn das Execute verlassen wird, ist das automatisch ein Terminate.

Außerdem ist es sinnlos Terminate zu setzen, wenn DU im Execute nie auf Terminated prüfst, denn Terminate macht nichts anderes, als diese Variable zu setzen.

Delphi hat auch beteits ein try-except um das Terminate drumrum aufgebaut, (genauso wie in der VCL um praktisch alle Methoden drumrum)
denn wenn im Windows eine Exception bis zum System durchrauscht, dann wird der komplette Prozess beendet. (du kennst bestimmt auch keinen Entwickler, der niemals eine Exception erzeugt, da wäre das echt blöd)


Einziger Nachteil, dass man nur über OnTerminate oder DoTerminate an diese Exception ran kommt (Property FatalException ist nur dort gesetzt, wenn Execute mit einer Exception abrauchte) und dass Delphi dort den Fehler nicht ausgibt (so wie in der VCL dann der Fehlerdialog kommt) ... sowas müsste man im OnTerminate selbst machen, weil Delphi das leider nicht standardmäßig macht.
$2B or not $2B
  Mit Zitat antworten Zitat