Reihenfolge von Initialization durcheinander
Hallo,
ich habe ein merkwürdiges Verhalten beim Ausführen meiner Anwendung. Bei der Suche nach einem Memory Leak habe ich folgendes festgestellt. 2 Units (Fremdkomponente - ExpressNavBar), ich nenne sie mal UnitA und UnitB haben einen initialization und finalization - Abschnitt. Öffne ich Delphi, dann mein Projekt und starte dieses mit F9, so wird erst initialization von UnitB, dann von UnitA ausgeführt. Das ist falsch und führt zu einem Speicherleck. Wenn ich das Projekt komplett erzeugen lasse oder alle dcu' s lösche, ist es genau andersrum. Also, erst initialization von UnitA, dann von UnitB. Da dann auch finalization in der beabsichtigten Reihenfolge ausgeführt wird, gibt es kein Memory Leak. Jetzt kann ich auch mit F9 starten und Alles ist OK. Wenn ich aber einmal mein Projekt schliesse und wieder öffne, ist die Reihenfolge wieder falsch, bis ich wieder einmal das Projekt erzeuge. Jetz habe ich versucht, das Verhalten so zu beeinflussen, dass UnitA immer vor UnitB geladen wird, indem ich sie in die Uses meines MainForms ganz vorn gesetzt habe. Aber es interessiert Delphi nicht. Was kann ich tun bzw. wo kann ich noch suchen? Habe Delphi 7 Pro im Einsatz. Gruß, Frank |
Re: Reihenfolge von Initialization durcheinander
Zitat:
keine Rolle spielen. Also müssen Dinge, die auf Objekte in anderen Units Bezug nehmen aus diesem Abschnitt entfernt werden und z.B. in einem Konstruktor untergebracht werden. Im Abschnitt initialization dürfen nur Dinge getan werden, die relativ gefahrlos sind. Es wäre z.B. falsch an dieser Stelle eine Datei oder eine serielle Schnittstelle zu öffnen. |
Re: Reihenfolge von Initialization durcheinander
Hi shmia...
erst mal Danke für die Antwort. Ich komme aber dennoch nicht weiter. Das ist der Code:
Delphi-Quellcode:
und die andere Unit:
unit dxNavBarViewsFact;
interface function dxNavBarViewsFactory: TdxNavBarViewsFactory; implementation var FNavBarViewsFactory: TdxNavBarViewsFactory; ... function dxNavBarViewsFactory: TdxNavBarViewsFactory; begin if FNavBarViewsFactory = nil then FNavBarViewsFactory := TdxNavBarViewsFactory.Create; Result := FNavBarViewsFactory; end; ... initialization finalization FreeAndNil(FNavBarViewsFactory);
Delphi-Quellcode:
Wenn Finalization der 1. Unit zuerst ausgeführt wird, wird FNavBarViewsFactory: TdxNavBarViewsFactory zerstört und wieder erzeugt. Damit habe ich mein Memory Leak.
unit dxNavBarXPViews;
... initialization dxNavBarViewsFactory.RegisterView(dxNavBarXP1View, 'XP1View', TdxNavBarXP1Painter); dxNavBarViewsFactory.RegisterView(dxNavBarXP2View, 'XP2View', TdxNavBarXP2Painter); dxNavBarViewsFactory.RegisterView(dxNavBarXPExplorerBarView, 'XPExplorerBarView', TdxNavBarXPExplorerBarPainter); finalization dxNavBarViewsFactory.UnRegisterView(dxNavBarXP1View); dxNavBarViewsFactory.UnRegisterView(dxNavBarXP2View); dxNavBarViewsFactory.UnRegisterView(dxNavBarXPExplorerBarView); Ich begreife nur nicht, wie es in meinem Projekt funktioniert. Mache ich neue Projekte und verwende die TdxNavBar, ist die Reihenfolge immer in Ordnung. Na ja, hab scho an den Clientservice von DevExpress geschrieben. Bis jetzt war der Support immer kompetent. Cu, Frank |
Re: Reihenfolge von Initialization durcheinander
Das "falsche Design" liegt hier:
Delphi-Quellcode:
Wenn das Objekt FNavBarViewsFactory zerstört wird, muss dieses Objekt "wissen", dass
finalization
dxNavBarViewsFactory.UnRegisterView(dxNavBarXP1View); dxNavBarViewsFactory.UnRegisterView(dxNavBarXP2View); dxNavBarViewsFactory.UnRegisterView(dxNavBarXPExplorerBarView); 3 View-Objekte registriert sind und UnRegisterView im Destruktor intern ausführen. Der obige finalization-Abschnitt ist dann völlig überflüssig und wird ertfernt. Schau mal den Destruktor an, vielleicht wird UnRegisterView schon aufgerufen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:51 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