VisualBasic Freigeben von Bildern

Gilrich

Cadet 4th Year
Registriert
Nov. 2009
Beiträge
96
Hallo zusammen
Ich brauch mal wieder eure Hilfe...
In meinem Programm lade ich nacheinander verschiedene Bilder in eine picturebox. Diese Bilder liegen alle im selben ordner. Später will ich den gesamten ordner mit allen Bildern löschen. Ich bekomme da aber immer einen Fehler, dass die Dateien gerade von einem anderen Prozess verwendet werden.

Ich hab dann probiert die Bilder erst als Bitmap zu speichern und dann diese in die Picturebox zu laden.

Also: Dim bmp As Bitmap = Bitmap.FromFile(Pfad)
Picturebox.image = bmp

das Originalbild kann dann aber trotzdem nicht gelöscht werden.

Hat jemand einen Rat für mich?
Vielen Dank
Gil
 
hm ich bin jetzt nicht der VB Guru, aber wie es muss sicher irgendwie gehen das bild wieder zu "entladen" also statt der referenz auf das bild den wert NULL oder NAN zu laden....
 
ich habs auch schon mit
Picturebox.image = nothing
und Picturebox.dispose versucht. Hilft aber nichts.
 
Quick and Dirty würde ich das hier mal in deiner Form zum Laden der bitmaps verwenden:

Code:
Public Function LoadBitmap(sFile As String) As System.Drawing.Bitmap
  Dim stream As New System.IO.MemoryStream(System.IO.File.ReadAllBytes(sFile))
  Return New Bitmap(stream);
End Function

Viel Erfolg.
 
Danke für die Hilfe
Das mit dem Stream klappt tatsächlich. Ich habs so gelöst:

Dim stream As New MemoryStream(My.Computer.FileSystem.ReadAllBytes(Pfad))
Dim bmp As Bitmap = New Bitmap(bildmemorystream)

Gruss GIl
 
Liegt daran das die Datei beim Erstellen des Bitmaps durch GDI+ geblockt wird und erst bei einem Dispose des Bitmaps wieder freigegeben wird. Aber das hast du da noch nicht gemacht, sondern nur die Picturebox disposed oder das Image von PictureBox auf Nothing gesetzt, was dazu führt das nach wie vor das Bitmap am Leben bleibt. Mit meiner Quick and Dirty Lösung bleibt zwar das Bitmap und der Stream noch am Leben, hat aber keinen direkten Link mehr zur Datei. Bei wenigen Bildern wirds nicht stören, bei vielen großen Bildern wirst du sicherlich schnell deine Anwendung um mehrer 100 MB aufblasen. Besser wäre es irgendwo den MemoryStream und das Bitmap zwischen zuspeichern um es dann bei Bedarf wieder disposen zu können. Meine Lösung ist wie gesagt nur Quick and Dirty...
 
alternative: Den Garbage Collector explizit anstoßen.

Ich habe bei der Arbeit mit Bitmaps im Speicher gemerkt, dass der Garbage Collector ziemlich hohe Intervalle hat. Wenn viele Grafiken schnell geladen und wieder disposed werden, haben die Anwendungen manchmal 700 MB Speicher belegt - bis zur nächsten Garbage Collection. Ich vermute stark, dass der Zugriffsfehler in der Zeitspanne zwidschen der Freigabe (pictureBox.Image = nothing) und der Garbage Collection auftreten kann.

Ein Expliziter Aufruf geht mit:
Code:
GC.Collect()
 
Zurück
Oben