Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Object mit einem laufenden Thread freigeben. Wie Thread im Destroy beenden. (https://www.delphipraxis.net/216880-object-mit-einem-laufenden-thread-freigeben-wie-thread-im-destroy-beenden.html)

bernau 17. Mär 2025 12:21

Object mit einem laufenden Thread freigeben. Wie Thread im Destroy beenden.
 
Ich habe ein Objekt, welches Daten aus dem Internet laden soll und dann kalkulieren soll.

Kann aber sein, dass das Objekt nicht mehr benötigt wird, bevor die Kalkulation beendet wurde. Wie kann das Objekt in seinem Destroy den Task beenden?

Hier mal ein Codebeispiel:

Delphi-Quellcode:
type

  TComplexDataRec = record
    // ManyItemsToCalculate
    dataAvailable:Boolean;
  end;

  TDataObject = class(TObject)
  public
    fcalculatedComplexData: TComplexDataRec;

    procedure LoadAndCalculate;

    constructor Create;
    destructor Destroy;override;
  end;

implementation

{ TDataObject }

constructor TDataObject.Create;
begin

end;

destructor TDataObject.Destroy;
begin
  // Instanz wird nicht mehr gebraucht und soll freigegeben werden.
  // Aber der Task, welcher mit LoadAndCalculate gestartet wurde
  // kann eventurell noch laufen.

  // Eigentlich darf ich diese Instanz nicht freigeben, solange der Task noch läuft, da dieser
  // ja auf die Variable fcalculatedComplexData zugreifen wird.

  // Wie beende ich den Task und stelle sicher, dass das zweite TThread.Synchronize noch
  // abgearbeitet wird.
  inherited
end;

procedure TDataObject.LoadAndCalculate;
var
  lComplexDataToCalc: TComplexDataRec;
begin
  TTask.run(
    procedure
    begin
      TThread.Synchronize(nil,
        procedure
        begin
          //************************************************************************ 
          // Hier mit einem NotifyEvent in eine Liste der aktiven Treads eintragen.
          //************************************************************************ 

          fcalculatedComplexData.dataAvailable := False;
        end);

        // hier Daten aus dem Internet laden und die complexe Berechnung durchführen
        // und in lComplexDataToCalc speichern

      TThread.Synchronize(nil,
        procedure
        begin
          fcalculatedComplexData:=lComplexDataToCalc;
          fcalculatedComplexData.dataAvailable := True;

          //************************************************************************ 
          // Hier mit einem NotifyEvent aus der Liste der aktiven Treads austragen.
          //************************************************************************ 
        end);
    end);
end;

Uwe Raabe 17. Mär 2025 12:31

AW: Object mit einem laufenden Thread freigeben. Wie Thread im Destroy beenden.
 
Über diese bzw. eine ähnliche Problematik habe ich mal was geschrieben: Async Tasks in VCL Projects. Vielleicht passt das ja für deinen Fall.

himitsu 17. Mär 2025 12:43

AW: Object mit einem laufenden Thread freigeben. Wie Thread im Destroy beenden.
 
im DoTerminate/OnTerminate,
aber am Einfachsten als Try-Except in der Execute-Methode,

bzw., wenn du eh ein eigenes DatenObjekt hast, dann das doch einfach als Interface (referenzgezählt). :angle:

bernau 17. Mär 2025 13:03

AW: Object mit einem laufenden Thread freigeben. Wie Thread im Destroy beenden.
 
Danke ihr beiden.

Das mit dem Interface ist ja mal ne Idee ;-)
Manchmal kann die Lösung so einfach sein.


<Insider>Frank (Mavarik), das wird bestimmt Gesprächsthema beim nächsten Delphifrühstück :-) </Insider>

Mavarik 17. Mär 2025 13:25

AW: Object mit einem laufenden Thread freigeben. Wie Thread im Destroy beenden.
 
Zitat:

Zitat von bernau (Beitrag 1547186)
Danke ihr beiden.

Das mit dem Interface ist ja mal ne Idee ;-)
Manchmal kann die Lösung so einfach sein.


<Insider>Frank (Mavarik), das wird bestimmt Gesprächsthema beim nächsten Delphifrühstück :-) </Insider>

Ich war nicht schnell genug... <Insider>Natürlich</Insider>

Mavarik :coder:

himitsu 17. Mär 2025 13:55

AW: Object mit einem laufenden Thread freigeben. Wie Thread im Destroy beenden.
 
<Outsider> Frank (der Andere) war schneller :angle2: </Outsider>

jaenicke 17. Mär 2025 14:37

AW: Object mit einem laufenden Thread freigeben. Wie Thread im Destroy beenden.
 
Tatsächlich habe ich das auch mit Interfaces gelöst. Konkret habe ich einen Handler dafür an unseren Basisformular-Typ angetackert, so dass man dann in dem Interface prüfen kann, ob das Fenster noch vorhanden, noch sichtbar usw. ist. So kann man nicht nur darin die anonyme Methode unterbringen, die nach dem Ende des Threads im Formular arbeitet, sondern man kann darin auch prüfen, ob das Ergebnis noch angezeigt werden muss usw., falls das nicht mehr nötig ist, wenn das Fenster nicht mehr sichtbar ist.

Das ganze noch mit Generics verfeinert gab eine echt schöne Lösung.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:58 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