![]() |
Speicher von abgeleiteter TThread Klasse freigeben
Hallo
ich habe folgendes Konstrukt:
Code:
Der Thread wird so gestartet:
MyThread = class(TThread)
private FPath: String; FCount: Integer; protected procedure Execute; override; public constructor Create; destructor Destroy; override; property Path: String read FPath write FPath; property Count: String read FCount write FCount; end; constructor TMyThread.Create; begin inherited Create(True); FreeOnTerminate := True; end; destructor TCopyThread.Destroy; begin inherited; end;
Code:
Und jetzt die Frage: Wie bzw. wo kann ich 'T' (TMyThread) am besten wieder freigeben, bzw. muss ich es überhaupt freigeben? Der eigentliche Thread wird ja nachdem er fertig ist, automatisch freigegeben (FreeOnTerminiate)
var
T: TMyThread; begin T := TMyThread.Create; T.Path := 'C:\'; T.Count := 100; T.Resume; end; Ein klassisches T.Free direkt nach dem T.Resume geht wohl nicht, da der Thread da ja noch läuft. Chris |
AW: Speicher von abgeleiteter TThread Klasse freigeben
Wenn du FreeOnTerminiate auf True setzt, dann brauchst du kein T.Free, da sich das Thread-Objekt selber freigibt, wenn die Threadverarbeitung fertig ist.
Willst du selber freigeben, dann muß FreeOnTerminiate auf False stehen, du mußt warten bis der Thread fertig ist und dann kannst du über T.Free das Thread-Objekt manuell freigeben. |
AW: Speicher von abgeleiteter TThread Klasse freigeben
Soll also heißen, solange ich nur Strings und Integers in meiner abgeleiteten Klasse definiere, muss ich diese nicht explizit freigeben??
Stellt sich mir die Frage, wann das Destroy der abgeleitenden Klasse aufgerufen wird. Angenommen ich hab außer Strings noch andere Objekte in meiner Thread Klasse definiert.
Delphi-Quellcode:
Der Thread wird zwar freigegeben, aber ohne MyThread.Free bleibt die StringList im Speicher.
MyThread = class(TThread)
private ... FList : TStringList; protected procedure Execute; override; public constructor Create; destructor Destroy; override; ... end; constructor TMyThread.Create; begin inherited Create(True); FreeOnTerminate := True; FList := TStringList.Create; end; destructor TMyThread.Destroy; begin FList.Free; inherited; end; Da muss ich jetzt wohl oder übel in meiner Thread Klasse ein OnTerminate einbauen?! |
AW: Speicher von abgeleiteter TThread Klasse freigeben
Moin,
Terminate sagt ja nicht, dass der Thread freigegeben wird (außer FreeOnTerminate, und wenn ich das richtig in Erinnerung habe, dann wird das dann auch freigegeben, wenn es die Aufgabe abgearbeitet hat). Dann kannst du deine StringList im Destruktor loswerden :D Alternativ, kannst du auch an das Ende der Execute-Methode Free schreiben, aber das dürfte dann auch auf "FreeOnTerminate" hinauslaufen. MfG Fabian |
AW: Speicher von abgeleiteter TThread Klasse freigeben
Zitat:
Die gesamte Execute-Methode wird intern über Try-Finally abgesichert, damit eine korrekte Freigabe möglich ist und Destroy beim FreeOnTerminate wirklich aufgerufen wird. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:51 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