AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Reihenfolge von Initialization durcheinander
Thema durchsuchen
Ansicht
Themen-Optionen

Reihenfolge von Initialization durcheinander

Ein Thema von dataspider · begonnen am 13. Jan 2006 · letzter Beitrag vom 13. Jan 2006
Antwort Antwort
Benutzerbild von dataspider
dataspider

Registriert seit: 9. Nov 2003
Ort: 04539 Groitzsch
1.351 Beiträge
 
Delphi 11 Alexandria
 
#1

Reihenfolge von Initialization durcheinander

  Alt 13. Jan 2006, 15:43
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
Frank Reim
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#2

Re: Reihenfolge von Initialization durcheinander

  Alt 13. Jan 2006, 16:24
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.
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von dataspider
dataspider

Registriert seit: 9. Nov 2003
Ort: 04539 Groitzsch
1.351 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: Reihenfolge von Initialization durcheinander

  Alt 13. Jan 2006, 17:05
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
Frank Reim
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#4

Re: Reihenfolge von Initialization durcheinander

  Alt 13. Jan 2006, 18:32
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.
Andreas
  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 09:33 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