Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Speicher von abgeleiteter TThread Klasse freigeben (https://www.delphipraxis.net/153837-speicher-von-abgeleiteter-tthread-klasse-freigeben.html)

CGEu 17. Aug 2010 19:50

Speicher von abgeleiteter TThread Klasse freigeben
 
Hallo
ich habe folgendes Konstrukt:
Code:
  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;
Der Thread wird so gestartet:
Code:
var
  T: TMyThread;
begin
  T := TMyThread.Create;
  T.Path := 'C:\';
  T.Count := 100;
  T.Resume;
end;
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)

Ein klassisches T.Free direkt nach dem T.Resume geht wohl nicht, da der Thread da ja noch läuft.

Chris

himitsu 17. Aug 2010 19:55

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.

CGEu 17. Aug 2010 22:20

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:
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;
Der Thread wird zwar freigegeben, aber ohne MyThread.Free bleibt die StringList im Speicher.
Da muss ich jetzt wohl oder übel in meiner Thread Klasse ein OnTerminate einbauen?!

xZise 18. Aug 2010 01:00

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

himitsu 18. Aug 2010 09:26

AW: Speicher von abgeleiteter TThread Klasse freigeben
 
Zitat:

Zitat von xZise (Beitrag 1042933)
Alternativ, kannst du auch an das Ende der Execute-Methode Free schreiben, aber das dürfte dann auch auf "FreeOnTerminate" hinauslaufen.

Es sei denn man sichert es nicht via Try-Finally ab und es tritt im Thread eine Exception auf.
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 18:29 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