Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Reihenfolge von Initialization durcheinander (https://www.delphipraxis.net/60882-reihenfolge-von-initialization-durcheinander.html)

dataspider 13. Jan 2006 14:43


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

shmia 13. Jan 2006 15:24

Re: Reihenfolge von Initialization durcheinander
 
Zitat:

Zitat von dataspider
2 Units (Fremdkomponente - ExpressNavBar), ich nenne sie mal UnitA und UnitB
haben einen initialization und finalization - Abschnitt.
... so wird
erst initialization von UnitB, dann von UnitA ausgeführt. Das ist falsch und führt zu einem Speicherleck.

Grundsätzlich darf die Reihenfolge, in der die initialization Abschnitte ausgeführt werden,
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.

dataspider 13. Jan 2006 16:05

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:
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);
und die andere Unit:
Delphi-Quellcode:
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);
Wenn Finalization der 1. Unit zuerst ausgeführt wird, wird FNavBarViewsFactory: TdxNavBarViewsFactory zerstört und wieder erzeugt. Damit habe ich mein Memory Leak.
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

shmia 13. Jan 2006 17:32

Re: Reihenfolge von Initialization durcheinander
 
Das "falsche Design" liegt hier:
Delphi-Quellcode:
finalization
  dxNavBarViewsFactory.UnRegisterView(dxNavBarXP1View);
  dxNavBarViewsFactory.UnRegisterView(dxNavBarXP2View);
  dxNavBarViewsFactory.UnRegisterView(dxNavBarXPExplorerBarView);
Wenn das Objekt FNavBarViewsFactory zerstört wird, muss dieses Objekt "wissen", dass
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