![]() |
Delphi-Version: 10 Berlin
Freigabe von TTask?
Hallo,
ich beschäftige mich gerade mit paralleler Verarbeitung und habe unter ![]() folgendes Code-Beispiel gefunden:
Code:
Dabei ist mir aufgefallen, daß zu
procedure TForm1.MyButtonClick(Sender: TObject);
var tasks: array of ITask; value: Integer; begin Setlength (tasks ,2); value := 0; tasks[0] := TTask.Create (procedure () begin sleep(3000); TInterlocked.Add (value, 3000); end); tasks[0].Start; tasks[1] := TTask.Create (procedure () begin sleep (5000); TInterlocked.Add (value, 5000); end); tasks[1].Start; TTask.WaitForAll(tasks); ShowMessage ('All done: ' + value.ToString); end;
Code:
kein
Tasks[x] := TTask.Create
Code:
folgt.
Tasks[x].Free
Zuerst dachte ich, man hätte es zu gunsten der Übersicht im Beispiel ausgelassen aber ich habe viele solcher Beispiele gefunden und nirgens wurde am Ende das TTask-Objekt wieder freigegeben... Alles schlechter Programmierstiel oder braucht ein Interfaced-Objekt nicht freigegeben zu werden? :gruebel: Zumal TTask eine Methode "Destroy" implementiert hat...!?! |
AW: Freigabe von TTask?
Delphi-Quellcode:
speichert ja keine TTask-Instanzen sonder ITask-Interfaces. Da erledigt das implizite Reference Counting das Aufräumen.
tasks
|
AW: Freigabe von TTask?
Erstmal danke für die Antwort!
Wann findet das Aufräumen über den Referenzzähler denn statt? In diesem Fall beim Verlassen der Prozedur wenn der Speicher der lokalen Variablen freigegeben wird? Falls ich sonst auf
Code:
zugreifen möchte um zu kontrollieren,
Tasks[x].Status
ob alle Tasks beendet sind, könnte ich ja dann ins "leere" greifen...?! |
AW: Freigabe von TTask?
Zitat:
Delphi-Quellcode:
den Referenzzähler herunterzählen. Ob dadurch aber wirklich schon die Instanz freigegeben wird, hängt noch von eventuellen anderen Referenzen ab.
tasks[I] := nil
|
AW: Freigabe von TTask?
Vielen Dank! Das hat meine Frage beantwortet! 8-)
|
AW: Freigabe von TTask?
Ist dir zuvor das Thema Interfaces und Referenzzählung wirklich noch nicht untergekommen? :shock:
|
AW: Freigabe von TTask?
Ich habe tatsächlich bisher nur einmal ein Interface implementieren
müssen um von einem DirectShow-Graphen die Einzelbilder eines Videostroms einer Webcam übernehmen zu können... und das war vor 7-8 Jahren... Warscheinlich habe ich es verdrängt: Der unter WindowsXP perfekt laufende Code lief auf Windows7 nicht mehr und ich habe den Grund dafür nie gefunden - war sehr frustrierend, nachdem ich die ganze DirectShow-Api selbst programmiert hatte und so viele C++ Beispiele aus der MSDN übersetzt hatte... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:04 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 by Thomas Breitkreuz