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 Terminate
d 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.