Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Freigabe von TTask? (https://www.delphipraxis.net/193562-freigabe-von-ttask.html)

skyobserver 15. Aug 2017 13:47

Delphi-Version: 10 Berlin

Freigabe von TTask?
 
Hallo,

ich beschäftige mich gerade mit paralleler Verarbeitung und habe unter

http://docwiki.embarcadero.com/RADSt...amming_Library

folgendes Code-Beispiel gefunden:

Code:
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;
Dabei ist mir aufgefallen, daß zu
Code:
Tasks[x] := TTask.Create
kein
Code:
Tasks[x].Free
folgt.
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...!?!

Uwe Raabe 15. Aug 2017 13:53

AW: Freigabe von TTask?
 
Delphi-Quellcode:
tasks
speichert ja keine TTask-Instanzen sonder ITask-Interfaces. Da erledigt das implizite Reference Counting das Aufräumen.

skyobserver 15. Aug 2017 14:13

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:
Tasks[x].Status
zugreifen möchte um zu kontrollieren,
ob alle Tasks beendet sind, könnte ich
ja dann ins "leere" greifen...?!

Uwe Raabe 15. Aug 2017 14:21

AW: Freigabe von TTask?
 
Zitat:

Zitat von skyobserver (Beitrag 1378799)
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?

In diesem Fall, ja. Du kannst aber auch gezielt über ein
Delphi-Quellcode:
tasks[I] := nil
den Referenzzähler herunterzählen. Ob dadurch aber wirklich schon die Instanz freigegeben wird, hängt noch von eventuellen anderen Referenzen ab.

skyobserver 15. Aug 2017 14:25

AW: Freigabe von TTask?
 
Vielen Dank! Das hat meine Frage beantwortet! 8-)

TiGü 15. Aug 2017 14:35

AW: Freigabe von TTask?
 
Ist dir zuvor das Thema Interfaces und Referenzzählung wirklich noch nicht untergekommen? :shock:

skyobserver 15. Aug 2017 14:52

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 23:08 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz