![]() |
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:
und
TMySingleton = class
class destructor Destroy(); class constructor Create(); end;
Delphi-Quellcode:
Auf Windows 7 wird alles wie erwartet ausgeführt:
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 XP:
Warum ist das so? Das kann doch nicht gewollt sein? Wie verhält sich das auf iOS, Android und Mac? |
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: |
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. |
AW: Ausführung eines Klassendestruktors OS-abhängig?
Liste der Anhänge anzeigen (Anzahl: 1)
Ja, in einer Konsolen-Anwendung mit
Delphi-Quellcode:
klappt es auf allen Systemen wie erwartet. Komisch.
WriteLn(..)
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:
hinzu, kann man das mit Tools wie
OutputDebugString(Text: PChar)
![]() 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? |
AW: Ausführung eines Klassendestruktors OS-abhängig?
Eventuell liegt das
![]() |
AW: Ausführung eines Klassendestruktors OS-abhängig?
Zitat:
(steht übrigens auch nirgends in deiner verlinkten Antwort, dass Class Destruktoren nach allen Finalisierungen laufen) Gruß, Sven |
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. |
AW: Ausführung eines Klassendestruktors OS-abhängig?
Das klärt trotzdem meine beiden Fragen nicht:
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!". |
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). |
AW: Ausführung eines Klassendestruktors OS-abhängig?
Zitat:
![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:26 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