Einzelnen Beitrag anzeigen

Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.305 Beiträge
 
Delphi 12 Athens
 
#1

Object mit einem laufenden Thread freigeben. Wie Thread im Destroy beenden.

  Alt 17. Mär 2025, 13:21
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;
Gerd
Kölner Delphi Usergroup: http://wiki.delphitreff.de
  Mit Zitat antworten Zitat