Diashow Speicherüberlauf (?)

  • VB.NET

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

    Diashow Speicherüberlauf (?)

    Hallo Leute,

    ich habe ein Programm geschrieben, welches in einem eingestellten Zeitintervall ein neues Bild als Backgroundimage einer Form lädt.
    Die Dateipfade zu den Bildern liegen in einem Array, welches jedoch ausreichend dimensioniert ist, der Fehler also nicht an der Arraygröße liegen kann.

    Das eigentliche Problem ist jedoch, dass nach einer gewissen Anzahl von Bildern das Programm abschmiert und mir in folgender Zeile

    VB.NET-Quellcode

    1. Me.BackgroundImage = System.Drawing.Image.FromFile(fotoorte(pic))


    als Fehler : "Out of Memory" anzeigt.

    (fotoorte ist das array & pic der index)


    Daher ist meine Frage ob, die Bilder, welche in als Backgroundimage lade, in irgendeinem cache gespeichert werden.

    Und falls ja, wie kann ich diesen cache leeren ?


    VG Felix ;)
    Nehme wir mal an du hast eine liste von pfaden an denen sich die bilder befinden. Am besten du machst das über drei variablen und nen index damit du weist bei welchem Bild du dich gerade befindest.
    z.B. Die Variablen:

    VB.NET-Quellcode

    1. Dim imgLast as image
    2. Dim imgCurrent as image
    3. Dim imgNext as image
    4. Dim index as integer

    "imglast" benötigst du eig. nur falls du die Diashow nicht nur forwärts abspielen wills.

    Dann schiebst du bei jedem bildwechsel erst das momantane bild von "imgCurrent" nach "imgLast" bzw. das bild in "imgNext" nach "imgCurren".
    Als nächstes lädst du das bild das sich als nächstes in deiner liste mit den Pfaden befindet in "imgNext".
    So sind immer nur 3 Bilder geladen und brauchen nicht so viel speicher.

    Das laden der Bilder lagerst du am besten in einen Thread aus. Weil sonst eine GUI einfriert wänn du größere Bilder z.B. von einem langsamen datenträger lädts.

    toxiccore schrieb:

    Daher ist meine Frage ob, die Bilder, welche in als Backgroundimage lade, in irgendeinem cache gespeichert werden.

    nein, aber Image ist IDisposable.
    Das bedeutet, dass der GarbageCollector ein Image nicht aufräumen kann.
    Sondern du mußt die Image.Dispose - Methode aufrufen, um die vom Bild belegten Resourcen freizugeben.

    ErfinderDesRades schrieb:

    toxiccore schrieb:

    Daher ist meine Frage ob, die Bilder, welche in als Backgroundimage lade, in irgendeinem cache gespeichert werden.

    nein, aber Image ist IDisposable.
    Das bedeutet, dass der GarbageCollector ein Image nicht aufräumen kann.
    Sondern du mußt die Image.Dispose - Methode aufrufen, um die vom Bild belegten Resourcen freizugeben.
    Das Image.Dispose hab ich mir angeguckt aber ich werd nicht schlau draus, wie ich das verwenden soll ?(

    Wulf schrieb:


    Nehme wir mal an du hast eine liste von pfaden an denen sich die bilder befinden. Am besten du machst das über drei variablen und nen index damit du weist bei welchem Bild du dich gerade befindest.
    z.B. Die Variablen:


    VB.NET-Quellcode

    1. Dim imgLast as image
    2. Dim imgCurrent as image
    3. Dim imgNext as image
    4. Dim index as integer






    "imglast" benötigst du eig. nur falls du die Diashow nicht nur forwärts abspielen wills.

    Dann schiebst du bei jedem bildwechsel erst das momantane bild von "imgCurrent" nach "imgLast" bzw. das bild in "imgNext" nach "imgCurren".
    Als nächstes lädst du das bild das sich als nächstes in deiner liste mit den Pfaden befindet in "imgNext".
    So sind immer nur 3 Bilder geladen und brauchen nicht so viel speicher.

    Das laden der Bilder lagerst du am besten in einen Thread aus. Weil sonst eine GUI einfriert wänn du größere Bilder z.B. von einem langsamen datenträger lädts.
    Die Pfade zu den Bildern werden in form1 in eine Listbox gepackt, und an ein Array übergeben, welches sich in form2 befindet.
    In dem array sind allerdings auch nur die pfade als string und nicht als wirkliches Image drin.

    Dann hab ich eine Routine, welche das aktuelle Bild ins BackgroundImage lädt, demnach hab ich doch eigl immer nur ein bild im speicher oder :huh: ?

    VB.NET-Quellcode

    1. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    2. Me.BackgroundImage = Nothing
    3. If looping = True Then
    4. If pic <= fotos Then
    5. Me.BackgroundImage = System.Drawing.Image.FromFile(fotoorte(pic))
    6. pic += 1
    7. Else
    8. pic = 0
    9. End If
    10. Else
    11. If pic <= fotos Then
    12. Me.BackgroundImage = System.Drawing.Image.FromFile(fotoorte(pic))
    13. pic += 1
    14. Else
    15. Me.Close()
    16. Form1.Visible = True
    17. Form1.Show()
    18. End If
    19. End If
    20. End Sub

    toxiccore schrieb:

    Das Image.Dispose hab ich mir angeguckt aber ich werd nicht schlau draus, wie ich das verwenden soll

    ich sehe keine annere Möglichkeit, als es halt aufzurufen.

    Um daraus schlau zu werden, müssteste dich informieren, was Schnittstellen sind, und insbesondere über die Bedeutung der IDisposable-Schnittstelle.

    aber erstmal einfach aufrufen und gucken, obs hilft - das ist nämlich nicht sicher.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ ()