![]() |
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; |
AW: Object mit einem laufenden Thread freigeben. Wie Thread im Destroy beenden.
Über diese bzw. eine ähnliche Problematik habe ich mal was geschrieben:
![]() |
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: |
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> |
AW: Object mit einem laufenden Thread freigeben. Wie Thread im Destroy beenden.
Zitat:
Mavarik :coder: |
AW: Object mit einem laufenden Thread freigeben. Wie Thread im Destroy beenden.
<Outsider> Frank (der Andere) war schneller :angle2: </Outsider>
|
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