AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Speicher von abgeleiteter TThread Klasse freigeben
Thema durchsuchen
Ansicht
Themen-Optionen

Speicher von abgeleiteter TThread Klasse freigeben

Ein Thema von CGEu · begonnen am 17. Aug 2010 · letzter Beitrag vom 18. Aug 2010
Antwort Antwort
CGEu

Registriert seit: 20. Mai 2010
Ort: Bayern
14 Beiträge
 
Delphi 10.3 Rio
 
#1

Speicher von abgeleiteter TThread Klasse freigeben

  Alt 17. Aug 2010, 20:50
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Speicher von abgeleiteter TThread Klasse freigeben

  Alt 17. Aug 2010, 20:55
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.
$2B or not $2B
  Mit Zitat antworten Zitat
CGEu

Registriert seit: 20. Mai 2010
Ort: Bayern
14 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: Speicher von abgeleiteter TThread Klasse freigeben

  Alt 17. Aug 2010, 23:20
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?!

Geändert von mkinzler (18. Aug 2010 um 06:26 Uhr) Grund: Code-Tag durch Delphi-Tag ersetzt
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#4

AW: Speicher von abgeleiteter TThread Klasse freigeben

  Alt 18. Aug 2010, 02:00
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

Alternativ, kannst du auch an das Ende der Execute-Methode Free schreiben, aber das dürfte dann auch auf "FreeOnTerminate" hinauslaufen.

MfG
Fabian
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Speicher von abgeleiteter TThread Klasse freigeben

  Alt 18. Aug 2010, 10:26
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.
$2B or not $2B

Geändert von himitsu (18. Aug 2010 um 10:28 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:26 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