Einzelnen Beitrag anzeigen

peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
672 Beiträge
 
Delphi 11 Alexandria
 
#14

AW: TThread gibt beim Beenden Speicherleck

  Alt 3. Mär 2019, 12:13
Stark vereinfacht habe ich folgende Threadklasse.
Erstellt wird die mit einem Aufruf von TTest.Run (passiert bei Programmstart und sieht schöner aus als irgendwas anonymes oder mit lokal deklarierten Klassenvariablen). Die private Deklaration von TestThread brauche ich extern nicht, deswegen private.

Das Sleep 10 Sekunden ist zum Testen da.
Wenn ich das Programm innerhalb der ersten 10 Sekunden schließe, bekomme ich einen Memory Leak.

Wie lässt sich das beheben, ohne am grundlegenden Aufbau der Klasse was zu ändern?
Der Thread soll bei Programmstart erzeugt werden aber erst noch warten, bis er seine Arbeit macht.
Du mußt auf eine Art und Weise warten, die es erlaubt, den Thread auch aufzuwecken, wenn er sich vorzeitig beenden soll.
Das klassische Konstrukt dafür verwendet einen TSimpleEvent. Den erzeugst Du im Constructor der Thread-Klasse bevor Du den inherited constructor aufrufst (nur wichtig in alten Delphi-Versionen). In der Execute-Methode wartest Du dann auf den Event, in deinem Fall mit einem Timeout, der deiner Sleep-Zeit entspricht. Dann überschreibst Du Terminate als

inherited;
WaitEvent.setEvent;

Der Rückgabewert von TSimpleEvent.Waitfor sagt Dir, ob die Methode zurückgekehrt ist weil der Event ausgelöst wurde oder der Timeout abgelaufen ist.
Peter Below
  Mit Zitat antworten Zitat