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;