AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Freigabe von TTask?

Ein Thema von skyobserver · begonnen am 15. Aug 2017 · letzter Beitrag vom 15. Aug 2017
Antwort Antwort
Benutzerbild von skyobserver
skyobserver

Registriert seit: 18. Mai 2005
Ort: Ense
114 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#1

Freigabe von TTask?

  Alt 15. Aug 2017, 14:47
Delphi-Version: 10 Berlin
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?
Zumal TTask eine Methode "Destroy" implementiert hat...!?!
Die größte Enttäuschung für einen Perfektionisten ist die Realität
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.472 Beiträge
 
Delphi 12 Athens
 
#2

AW: Freigabe von TTask?

  Alt 15. Aug 2017, 14:53
tasks speichert ja keine TTask-Instanzen sonder ITask-Interfaces. Da erledigt das implizite Reference Counting das Aufräumen.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von skyobserver
skyobserver

Registriert seit: 18. Mai 2005
Ort: Ense
114 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#3

AW: Freigabe von TTask?

  Alt 15. Aug 2017, 15:13
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...?!
Die größte Enttäuschung für einen Perfektionisten ist die Realität
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.472 Beiträge
 
Delphi 12 Athens
 
#4

AW: Freigabe von TTask?

  Alt 15. Aug 2017, 15:21
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 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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von skyobserver
skyobserver

Registriert seit: 18. Mai 2005
Ort: Ense
114 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#5

AW: Freigabe von TTask?

  Alt 15. Aug 2017, 15:25
Vielen Dank! Das hat meine Frage beantwortet!
Die größte Enttäuschung für einen Perfektionisten ist die Realität
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Freigabe von TTask?

  Alt 15. Aug 2017, 15:35
Ist dir zuvor das Thema Interfaces und Referenzzählung wirklich noch nicht untergekommen?
  Mit Zitat antworten Zitat
Benutzerbild von skyobserver
skyobserver

Registriert seit: 18. Mai 2005
Ort: Ense
114 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#7

AW: Freigabe von TTask?

  Alt 15. Aug 2017, 15:52
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...
Die größte Enttäuschung für einen Perfektionisten ist die Realität
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:54 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