AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Aufruf von TObject.Free verzögern?

Ein Thema von Leanahtan · begonnen am 17. Dez 2009 · letzter Beitrag vom 17. Dez 2009
Antwort Antwort
Leanahtan

Registriert seit: 5. Jun 2009
62 Beiträge
 
Turbo Delphi für Win32
 
#1

Aufruf von TObject.Free verzögern?

  Alt 17. Dez 2009, 19:47
In unserem Projekt gibt es einen Typ TNotifyList zur Verwaltung von Events. Dieser ist Bestandteil der meisten anderen Objekttypen, und wird daher im constructor dieser Typen erfeugt, und im Destructor mit Free wieder freigegeben. Nun gibt es aber eine Möglichkeit, dass eine Methode von TNotifyList noch in einem Schleifendurchlauf hängt, während Free aufgerufen wird, was letztlich zu einem Absturz führt. Da man in einer Methode nicht wirklich überprüfen kann, ob Self nicht schon freigegeben wurde, habe ich mir überlegt, einen eigenen Destructor für TNotifyList zu basteln. Dieser soll zuerst prüfen, ob das Objekt schon zerstört werden darf, und nur dann das Objekt freigeben. Nach Möglichkeit möchte ich dabei nichts an den externen Aufrufen von TNotifyList.free ändern müssen (der Umweg über eine Hilfsmethode TryFree wäre nur die letzte Notlösung).

Ich bin mir jetzt aber nicht so sicher, wie ich das genau machen kann/muss. Wie funktioniert das mit inherited bzw. wie kann ich sicherstellen, dass beim Aufruf von Free das Objekt nur freigegeben wird, wenn eine bestimmte Bedingung erfüllt wurde?
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.004 Beiträge
 
Delphi 2009 Professional
 
#2

Re: Aufruf von TObject.Free verzögern?

  Alt 17. Dez 2009, 20:05
Nun, ein Veto oder eine Exception sind in einem Destruktor nicht ganz einfach zu realisieren.

Aber anders herum könnte die TNotifyList ein Flag enthalten, das ihren Status ("arbeitend" / "ruhend") darstellt, und dann abgefragt werden könnte:

Delphi-Quellcode:
while MyNotifyList.IsWorking do
  Application.ProcessMessages;

MyNotifyList.Free;
Zusätzlich kann man noch eine zeitliche Grenze verwenden, nach deren Überschreitung das Free erzwungen wird selbst wenn noch Verarbeitungen stattfinden:

Delphi-Quellcode:
while (MyNotifyList.IsWorking) and (ElapsedTime < MAX_WAIT_TIME) do
  Application.ProcessMessages;

MyNotifyList.Free;
Viele Grüße,
Michael Justin
habarisoft.com
  Mit Zitat antworten Zitat
Alter Mann

Registriert seit: 15. Nov 2003
Ort: Berlin
934 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

Re: Aufruf von TObject.Free verzögern?

  Alt 17. Dez 2009, 20:09
Hi,

leider schon alles gesagt/geschrieben.

Bis bald.
  Mit Zitat antworten Zitat
Leanahtan

Registriert seit: 5. Jun 2009
62 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Aufruf von TObject.Free verzögern?

  Alt 17. Dez 2009, 20:14
Danke für die schnelle Antwort. Also die Idee mit dem Flag hatte ich auch schon, und hab ich auch schonmal so umgesetzt.

Delphi-Quellcode:
  if fNotifyList.RunningEventCalls=0 then
    fNotifyList.Free
  else
    fNotifyList.WantDestroy:=true;
In der Schleife würde dann geprüft, ob die NotifyList zerstört werden soll. Was mich an dieser Lösung etwas stört - eine entsprechende Abfrage wäre dann in fast jedem Destructor nötig, und das sind bei X-Force nicht wenige. Deshalb wollte ich das halt irgendwie zu TNotifyList verlagern (zur Not vielleicht dann doch lieber mit TryFree). Wenn das mit dem Veto im Destructor nicht ganz trivial ist, heißt das ja wenigstens, das meine Frage nicht ganz so dumm ist, wie ich erst gedacht hab.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.142 Beiträge
 
Delphi 12 Athens
 
#5

Re: Aufruf von TObject.Free verzögern?

  Alt 17. Dez 2009, 20:40
Überschreibe den Destructor und baue dort eine Schleife rein, welche solange wartet, bis das Objekt freigegeben werden darf ... der Destructor wird ja von Free aufgerufen.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Leanahtan

Registriert seit: 5. Jun 2009
62 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Aufruf von TObject.Free verzögern?

  Alt 17. Dez 2009, 21:03
Danke für den Tipp. Leider wird das so wohl auch nicht funktionieren. Das Problem ist, dass besagte For-Schleife letztlich den Aufruf von TNotifyList.Free enthält, und daher nicht weiter abgearbeitet werden kann, wenn man im Destructor wartet
Das lässt sich auch nicht vermeiden, denn die in der Schleife bearbeiteten Events können Skriptfunktionen aufrufen - und was dort gemacht wird, unterliegt nicht mehr der Kontrolle dass Hauptprogramms. Ich werde wohl doch den weg über eine zusätzliche Methode TryFree gehen müssen. Gibt ja in Delphi eine recht brauchbare Suchen&Ersetzen-Funktion.
  Mit Zitat antworten Zitat
Antwort Antwort


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 00:13 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