Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Ausführung eines Klassendestruktors OS-abhängig? (https://www.delphipraxis.net/179678-ausfuehrung-eines-klassendestruktors-os-abhaengig.html)

Der schöne Günther 24. Mär 2014 12:47


Ausführung eines Klassendestruktors OS-abhängig?
 
Chaos und Verwirrung. Meine Welt ist normalerweise so klein, dass sich sowohl Entwicklung als auch Auslieferung auf Windows 7 vollzieht.

Ausnahmsweise musste nun etwas noch auf Windows XP laufen. Und ich muss schockiert feststellen: Der Klassendestruktor wird nicht ausgeführt.

Gegeben sei
Delphi-Quellcode:
  TMySingleton = class
     class destructor Destroy();
     class constructor Create();
  end;
und
Delphi-Quellcode:
class constructor TMySingleton.Create();
begin
   ShowMessage('Das ist der Klassenkonstruktor');
end;

class destructor TMySingleton.Destroy();
begin
   ShowMessage('Das ist der Klassendestruktor');
end;

initialization
   Winapi.Windows.MessageBox(0, 'initialization', '', 0);

finalization
   Winapi.Windows.MessageBox(0, 'finalization', '', 0);
Auf Windows 7 wird alles wie erwartet ausgeführt:
  1. Das ist der Klassenkonstruktor
  2. initialization
  3. (...)
  4. finalization
  5. Das ist der Klassendestruktor

Auf Windows XP:
  1. Das ist der Klassenkonstruktor
  2. initialization
  3. (...)
  4. finalization


Warum ist das so? Das kann doch nicht gewollt sein? Wie verhält sich das auf iOS, Android und Mac?

Stevie 24. Mär 2014 14:14

AW: Ausführung eines Klassendestruktors OS-abhängig?
 
Sicher, dass in deinem Programm auf XP auch die Klasse irgendwo referenziert wird? Ist das nicht der Fall, dann werden auch Klassen Konstruktor/Destruktor nicht ausgeführt (das ist der schöne Unterschied zum initialization/finalization Block)

Edit: Vergisses - der Konstruktor wurde ja ausgeführt... hmmm

Hast du mal eine andere Form des "Logging" benutzt? Hast du mal mit einem Stoppunkt im Destruktor debuggt?

P.S. Eeeek, Singleton! :mrgreen:

Daniel 24. Mär 2014 15:00

AW: Ausführung eines Klassendestruktors OS-abhängig?
 
Kann es sein, dass sich Deine App mit ihren MessageBoxen verheddert? MessageBoxen im Finalization-Abschnitt waren meines Wissens noch nie eine gute Idee.
Ich habe eben mit Delphi XE5 eine Konsolen-Anwendung geschrieben und die jeweiligen Code-Stellen eine Ausgabe mit WriteLn() erzeugen lassen.
Klappt unter Windows 8.1 ebenso wie unter Windows XP völlig korrekt auf die erwartete Weise.

Der schöne Günther 24. Mär 2014 16:31

AW: Ausführung eines Klassendestruktors OS-abhängig?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ja, in einer Konsolen-Anwendung mit
Delphi-Quellcode:
WriteLn(..)
klappt es auf allen Systemen wie erwartet. Komisch.

In meinem konkreten Fall waren es natürlich keine Messageboxen, sondern das abschließende Schreiben der Einstellungen beim Beenden der Anwendung. Auf dem XP-Rechner wurde die Datei noch nicht einmal angelegt (
Delphi-Quellcode:
TIniFile.UpdateFile()
)

Ich hätte auch grade auf einer XP VM schwören können, die Klassendestruktor-Messagebox einmal kurz aufblitzen zu sehen. Ich habe keinen XP-Rechner mit RAD Studio zur Hand und mit Remote Debugging habe ich auch keine Erfahrung. Deshalb kann ich hier nur so amateurhafte Beobachtungen machen :(

Wo könnte ich denn anfangen zu suchen, woran es liegt?


PS: Füge ich in meiner VCL-Anwendung ein
Delphi-Quellcode:
OutputDebugString(Text: PChar)
hinzu, kann man das mit Tools wie DebugView noch sehen.

Mein Titel ist also falsch: Der Klassen-Destruktor wird sehr wohl ausgeführt, aber anscheinend funktioniert die Hälfte darin (Messageboxen, Dateioperationen) nicht mehr vernünftig. Oder er zieht sich selbst nach ein paar Millisekunden den Boden unter den Füßen weg. Ich weiß es nicht.

Gibt es allgemeine Richtlinien, was man dort noch tun darf?

Stevie 24. Mär 2014 17:15

AW: Ausführung eines Klassendestruktors OS-abhängig?
 
Eventuell liegt das daran (dass der nach allen finalizations läuft), dass du manche Sachen nicht mehr korrekt ausführen kannst.

JamesTKirk 25. Mär 2014 06:16

AW: Ausführung eines Klassendestruktors OS-abhängig?
 
Zitat:

Zitat von Stevie (Beitrag 1253297)
Eventuell liegt das daran (dass der nach allen finalizations läuft), dass du manche Sachen nicht mehr korrekt ausführen kannst.

Class Destruktoren laufen nicht nach allen finalization Sections. Alle Units werden in umgekehrter Reihenfolge zur Initialisierung finalisiert und innerhalb jeder Unit ist die Reihenfolge der Finalisierung dann:
  • Finalization Section
  • Class Destructors
  • Finalisierung von Variablen, Konstanten, etc.

(steht übrigens auch nirgends in deiner verlinkten Antwort, dass Class Destruktoren nach allen Finalisierungen laufen)

Gruß,
Sven

Stevie 25. Mär 2014 07:17

AW: Ausführung eines Klassendestruktors OS-abhängig?
 
Danke für die Korrektur mit dem alle. Das sollte eher "nach den finalizations" lauten.

Allerdings stimmt deine Reihenfolge nicht. Der Class destructor läuft ebend nach der Finalisierung der Variablen.

Das steht sowohl im verlinkten Artikel und kannst du ganz einfach nachprüfen.

Der schöne Günther 25. Mär 2014 10:01

AW: Ausführung eines Klassendestruktors OS-abhängig?
 
Das klärt trotzdem meine beiden Fragen nicht:
  1. Warum klappt mein Destruktor (Messagebox, Dateien schreiben) unter Windows 7 immer zuverlässig, unter XP aber nie? Da muss doch noch mehr dahinter stecken...
  2. Was darf ich mir denn nun im Klassendestruktor erlauben? Unter XP sieht es für mich wirklich so aus, als hätte meine Anwendung zu diesem Zeitpunkt nur noch wenige Millisekunden zu leben...

Ich hatte für ein kleines Projekt ein TUserSettings-Singleton. Es sollte durch den Klassendestruktor beim ordentlichen Beenden der Anwendung die Benutzereinstellungen dauerhaft speichern (Registry oder ini-Datei).

Bislang hat mich noch keiner gepackt, geschüttelt und geschrien "Nein! Tu's nicht!".

stahli 25. Mär 2014 10:29

AW: Ausführung eines Klassendestruktors OS-abhängig?
 
Hast Du mal getestet, ob Deine eigentliche Aktion "Speichern von Einstellungen" korrekt durchgeführt wird?

Vielleicht liegt Dein Problem ja nur beim Aufruf der MessageBox (dass das XP die nicht mehr anzeigt wenn die Haupt-Anwendung gerade beendet wird).

TiGü 25. Mär 2014 10:32

AW: Ausführung eines Klassendestruktors OS-abhängig?
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1253386)
Bislang hat mich noch keiner gepackt, geschüttelt und geschrien "Nein! Tu's nicht!".

Drehst du dich manchmal im Büro um? :zwinker:


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:35 Uhr.
Seite 1 von 2  1 2      

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