Announcement

Collapse
No announcement yet.

Object aus Hashtabelle geht "verloren"

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Object aus Hashtabelle geht "verloren"

    Habe eine Art Factory, die je nach Übergabeparameter eine passende Instanz zurück liefert. Ist die Instanz noch nicht existent, wird sie erstellt und zusammen mit dem Übergabeparameter als Schlüssel in einer HashTabelle vorgehalten, um sie bei weiteren Aufrufen nicht neu erzeugen zu müssen (es werden erhebliche Datenmengen geladen).<br>
    Wird nun ein 2. mal die Instanz aus der Hashtabelle angefordert, so hat sich dies Instanz mittlerweile schon wieder zerlegt und der Zugriff darauf läuft auf eine AV.<br>
    Wie kann ich meine Instanzen dazu bringen, am Leben zu bleiben bis ich sie definitiv zerstöre?<br<
    (Es liegt übrigens nicht an der Hashtabelle, auch bei anderen Listen hatte ich das Problem)

  • #2
    Hallo Friedhelm,<BR><BR>
    sind denn die Objekte, die dein factory erzeugt, von TComponent abgeleitet.<BR>
    Ich weiss nicht, ob ich es richtig verstehe. Es existieren noch Verweise in deiner Hashtable, obwohl die Objekte bereits wieder zerstört sind, oder?<BR>
    Ich mach so etwas ähnliches mit den Forms. Da gehört die Liste (statt Hash) zu einer Komponente (ViewCtrl) , welche nach dem Erzeugen der Instanz diese mit FreeNotification(Self) anweist, den ViewCtrl über das Zerstören der Instanz zu Informieren.<BR>
    In ViewCtrl überschreibe ich dann die Methode Notification und werfe zerstörte Instanzen aus der Liste.<BR>
    Aber das funktioniert halt nur mit Objecten, welche von TComponent abstammen.<BR><BR>Fran

    Comment


    • #3
      Hallo Frank,<br>

      nein, die Objekte sind TInterfacedObject abgeleitet.
      Da die Klasse (TClassificationTable) noch ein Interface implementieren muß, hatte ich<br>
      <PRE>TClassificationTable = class(TInterfacedObject, IClassificationTable)</PRE>
      <br>
      gemacht. Das habe ich auf <br>
      <PRE>TClassificationTable = class(TInterfacedPersistent, IClassificationTable)</PRE>
      <br> geändert, danach geht alles einwandfrei.
      <br>
      Danke für die Anregung, Friedhel

      Comment


      • #4
        Hallo Friedhelm,<br><br>ich denke mal, das ich ein ähnliches Problem hatte. Ich habe Objecte (Interfaceobjecte) erzeugt und diese in einer TStringlist abgelegt. Da das TStringList-Object kein Hinzufügen von Schnittstellen-Objecte akzeptiert, musste ich das über den Umweg der Typeumwandlung machen. Dabei passiert aber, das der Referenzzähler (welcher über die Lebensdauer entscheidet) nicht um eins erhöht wird. Das aber wichtig, da sonst nach der nächsten Nutzung des abgelegten Objectes, der Referenzzähler wieder um eins und zwar auf Null gesetzt und das Object zerstört wird. Hier hilft nur beim Hinzufügen den Referenzzähler um eins erhöhen und ganz wichtig, beim Zerstören der Liste oder beim Entfernen eines Interfaceobjectes aus der Liste, den Referenzzähler wieder um eins minimieren.<br><br>MFG<br><br>André Mosinsk

        Comment

        Working...
        X