dynamisches Löschen von Instanzen einer Klasse

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    dynamisches Löschen von Instanzen einer Klasse

    Hallo Profi's,

    ich erstelle zur Laufzeit in einem Spiel Textobjekte, welche sich selbst in einer DrawRoutine perSpriteBatch zeichnen.
    Soweit, so gut.

    Die Objekte sollen sich, nach einer gewissen Zeit selber ausblenden und aus dem Speicher löschen.

    In der Main:

    hier erzeuge ich 2 Testobjekte

    VB.NET-Quellcode

    1. Private Sub HandleMousePressed(sender As Object, e As InputManager.MouseButtonEvent) Handles inputManager.MousePressed
    2. Dim btn As InputManager.MouseButton = e.Button
    3. Dim pos As Vector2 = e.Pos
    4. Dim t As TextObject
    5. ' Test
    6. t = New TextObject(_game, spriteBatch, inputManager, e.Pos, fontList("Arial 20"), "test1", True)
    7. TextObjectList.Add(t)
    8. _game.Components.Add(t)
    9. t = New TextObject(_game, spriteBatch, inputManager, e.Pos, fontList("Arial 12"), "test2", True)
    10. TextObjectList.Add(t)
    11. _game.Components.Add(t)
    12. End Sub



    und hier sollen sie gelöscht werden:

    VB.NET-Quellcode

    1. Public Overrides Sub Update(gameTime As GameTime)
    2. MyBase.Update(gameTime)
    3. For x = TextObjectList.Count - 1 To 0 Step -1
    4. If TextObjectList.Item(x).KillMe Then
    5. TextObjectList.Item(x).Dispose()
    6. TextObjectList.RemoveAt(x)
    7. End If
    8. Next
    9. End Sub



    Mein Problem ist: alles läuft ohne Fehler, die Liste leert sich, die Objekte werden disposed.
    Aber - sie zeichnen sich trotzdem weiter.

    Also wie ich das sehe, wird das Dispose nicht ausgeführt, bzw steckt kein Code dahinter?
    Wie kann ich das prüfen/fixen?
    Was genau ist TextObject? Das einzige, was ich fand, ist was aus CrystalReports. Ist das ne eigene Klasse? Implementiert es Dispose (ja, sonst würde der Aufruf nicht gehen)? Wenn ja, wie (denn das musst Du selbst festlegen, denn das Implementieren von IDisposable ist Deine Aufgabe)? Musst Du ggf. noch das Objekt aus der Components-Liste entfernen, zu der Du es in Zeile#8 und #11 hinzugefügt hast?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @Rene M. Nach dem Löschen musst Du das Darstellungsobjekt invalidisieren, damit die Darstellung verschwindet.
    Ansonsten setz einen Haltepunkt drauf und kläre das auf:
    Debuggen, Fehler finden und beseitigen
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    danke für den schnellen Response.

    @Zed: das Removen aus der Componentsliste wars - nun läuft das so wie ich es wollte.

    Aber die Frage zum Dispose: ich habe das Gefühl, dass die Instanz immer noch existiert, nur nicht mehr aufgerufen wird. Somit eben auch der Speicher nicht freigegeben wird. Was muss ich tun um dies ggfls zu ändern?

    Rene M. schrieb:

    Somit eben auch der Speicher nicht freigegeben wird
    Wie kommst Du darauf?

    VaporiZed schrieb:

    Implementiert es Dispose (ja, sonst würde der Aufruf nicht gehen)? Wenn ja, wie (denn das musst Du selbst festlegen, denn das Implementieren von IDisposable ist Deine Aufgabe)?
    Sobald ein Objekt seine Dispose-Methode aufruft und seine Sachen aufgeräumt hat, die der Garbage Collector selber nicht schafft, ist das Objekt zum Abschuss freigegeben. Wann es dann wirklich entsorgt wird, entscheidet das (Betriebs)System selbst, siehe auch mein Post neulich.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.