AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Objekte in der richtigen Reihenfolge freigeben

Ein Thema von Rainer Wolff · begonnen am 5. Mai 2011 · letzter Beitrag vom 5. Mai 2011
Antwort Antwort
Rainer Wolff

Registriert seit: 25. Okt 2005
Ort: Bretten
318 Beiträge
 
Delphi 10.4 Sydney
 
#1

Objekte in der richtigen Reihenfolge freigeben

  Alt 5. Mai 2011, 09:16
Delphi-Version: 2006
Hallo,

ich verwende in meinem Projekt ein Modul zum Meldungen mitloggen. Dieses Logging ist als Singleton implementiert, der beim ersten Zugriff initialisiert wird.
Freigegeben wird die Klasse im finalization-Abschnitt, und da liegt gerade mein Problem: Die Klasse wird freigegeben, danach wird in einer anderen Unit noch eine Log-Meldung ausgegeben und es kommt zur Zugriffsverletzung.

Wie löst ihr so ein Problem? Soweit ich mich informiert habe, legt der Compiler die Reihenfolge der finalization fest, so dass ich darauf nur eingeschränkt Einfluss habe.
Das Singleton als Interface einbauen und somit die Speicherverwaltung an Delphi abdrücken?
Alle Meldungen, die nach der finalization kommen, ignorieren (nicht so gut)?
Oder was gibt es sonst für Möglichkeiten?

Gruß Rainer
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

AW: Objekte in der richtigen Reihenfolge freigeben

  Alt 5. Mai 2011, 09:23
Du könntest im finalization die Instanz auf nil setzen und in deiner Logfunktion prüfen ob die Instanz <> nil ist.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.116 Beiträge
 
Delphi 12 Athens
 
#3

AW: Objekte in der richtigen Reihenfolge freigeben

  Alt 5. Mai 2011, 09:57
Soweit ich mich informiert habe, legt der Compiler die Reihenfolge der finalization fest, so dass ich darauf nur eingeschränkt Einfluss habe.
Alle Units, welche im Interface-Abschnitt eingebunden sind werden immer vor "initialization" der eigenen Unit initialisiert und nach "finalization" finalisiert.

Wenn du eine Unit im Implementation-Abschitt einbindest, dann kann diese Unit eventuell erst nach "initialization" initialisiert, bzw. vor "finalization" finalisiert werden
und man sollte daher dort nicht (ohne Prüfung) auf globale Objekte zugreifen.


Also indirekt hast du schon etwas Einfluß, auf die Reihenfolge.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Rainer Wolff

Registriert seit: 25. Okt 2005
Ort: Bretten
318 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Objekte in der richtigen Reihenfolge freigeben

  Alt 5. Mai 2011, 10:01
Du könntest im finalization die Instanz auf nil setzen und in deiner Logfunktion prüfen ob die Instanz <> nil ist.
Hab ich temporär so schon implementiert, aber: Dann ist zwar die Zugriffsverletzung weg, aber es werden halt auch keine Meldungen mehr geloggt.

@Himitsu: Innerhalb einer einzelnen Unit wäre das Problem wohl so zu lösen, aber die Logfunktion ist ja so breit über viele verschiedene Units gestreut, dass die Kontrolle auf diesem Weg schwierig wird.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.116 Beiträge
 
Delphi 12 Athens
 
#5

AW: Objekte in der richtigen Reihenfolge freigeben

  Alt 5. Mai 2011, 10:13
Du könntest im finalization die Instanz auf nil setzen und in deiner Logfunktion prüfen ob die Instanz <> nil ist.
Hab ich temporär so schon implementiert, aber: Dann ist zwar die Zugriffsverletzung weg, aber es werden halt auch keine Meldungen mehr geloggt.
Tja, wenn das Logging-Objekt freigegeben ist, dann kann man natürlich nix mehr loggen.

Als eine Alternative bliebe noch eine statisch eingebundene DLL, in welcher das Logging abläuft.
Diese DLL wird auf jedenfall erst nach allen deinen Unis entladen.

Oder du machst es so, daß, sobald das Logging schon freigegeben wurde, dieses nochmal kurz erstellt, der Eintrag eingetragen und dann gleich wieder freigegeben wird.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.336 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Objekte in der richtigen Reihenfolge freigeben

  Alt 5. Mai 2011, 10:25
Alle Units, welche im Interface-Abschnitt eingebunden sind werden immer vor "initialization" der eigenen Unit initialisiert und nach "finalization" finalisiert.
Ich denke, die Aussage stimmt LEIDER nicht. Ich habe das hier schon einmal nachgefragt.
Dass alternative Lösungen möglich sind ist schon klar, aber die Initialisierungsreihenfolge von Units kann man m.E. nicht erzwingen.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.754 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Objekte in der richtigen Reihenfolge freigeben

  Alt 5. Mai 2011, 10:47
Hallo,

vielleich kannst Du das Singleton auch so aufbauen:

Delphi-Quellcode:
 TLogger = class(TObject)
    private
      messageList : TThreadStringList;
      constructor create;
    public
      destructor Destroy; override;
      procedure push(s: AnsiString);
      function pop:AnsiString;
      function stackCount : Word;
      class function getInstance:TLogger;
  end;

implementation


var
  singleInstanceLogger : TLogger;


constructor TLogger.create;
begin
  inherited create;
  messageList := TThreadStringList.create;
end;

destructor TLogger.Destroy;
begin
  freeAndNil(MessageList);
  inherited destroy;
end;

class function TLogger.getInstance:TLogger;
begin
  if singleInstanceLogger = nil then
    singleInstanceLogger := Tlogger.create;

  result := singleInstanceLogger;
end;
Edit: Es vielleicht etwas zu kurz gegriffen, denn wenn zwischen dem destroy und der Ausgabe von Meldungen
kein getInstance mehr aufgerufen wird, knallt es auch hier...


Grüße
Klaus
Klaus

Geändert von Klaus01 ( 5. Mai 2011 um 10:54 Uhr)
  Mit Zitat antworten Zitat
Rainer Wolff

Registriert seit: 25. Okt 2005
Ort: Bretten
318 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Objekte in der richtigen Reihenfolge freigeben

  Alt 5. Mai 2011, 11:14
@Klaus: Vielleicht stehe ich noch auf der Leitung, aber:
Wo und wodurch wird dein Singleton denn wieder freigegeben, denn die Freigabe ist ja mein Problem.

Rainer
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.754 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: Objekte in der richtigen Reihenfolge freigeben

  Alt 5. Mai 2011, 11:26
..freigeben kann man es mit freeAndNil(LoggerInstance) oder LoggerInstance.free.

Aber wie ich im Nachtrag meines Beitrages bereits gesagt habe, greift das zu kurz.

Oder du müsstes vor jeder LogMeldung loggerInstance := TLogger.getInstance aufrufen,
dann wird gegebenenfalls eine Instanz erzeugt oder die bereits bestehende übergeben.

Freigeben kannst Du sie dann in jedem finalization Abschnitt einer jeden Unit.
Oder in dem finalization Abschnitt der letzten Unit.


Zitat:
Finalization sections are executed in the opposite order from initialization sections. For example, if your application initializes units A, B, and C, in that order, it will finalize them in the order C, B, and A.
Quelle: Hilfe aus TurboDelphi

Grüße
Klaus
Klaus

Geändert von Klaus01 ( 5. Mai 2011 um 11:44 Uhr)
  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 05:56 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