Ich möchte in Visual Basic in eine Picturebox mehrere Bilder nacheinander laden, jedoch wird das Bild irgendwann nicht mehr angezeigt. Was kann man da machen?

3 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Ich kann dir zumindest so viel sagen, dass es nicht an der Programmiersprache liegt. Wie bereits erwähnt wird eine Lösung schwierig, wenn man deinen Code nicht sieht. Noch schwieriger, wenn du glaubst, dass sowieso alles richtig ist.

Ich vermute, dass du ein Speicherproblem hast und ggf. die Bilder disposen solltest. Das muss aber auch nicht sinnvoll sein, je nach dem, wo die Bilder denn herkommen.

Taner1998444 
Fragesteller
 23.01.2016, 22:38

Die Bilder sind auf dem Desktop gespeichert. Ich glaube auch nicht, dass ich beim Programmieren keine Fehler gemacht habe aber ich habe das ganze im kleinerem Rahmen ausprobiert und da hat alles gut funktioniert. Kannst du mir vielleciht genau sagen wie ich das Speicherproblem angehen kann?

Das hat mir schon gut weitergeholfen!

Vielen dank dafür :)

0
CrystalixXx  24.01.2016, 13:43
@Taner1998444

Wie lädst du denn die Bilder? Es gibt da viele Möglichkeiten und einige davon können bei Unachtsamkeit zu solchen Speicherproblemen führen. Nachfolgend zwei Beispiele mit diesen Deklarationen:

 ' Enthält alle Pfade zu den Bilddateien
Private wallpaperList As New List(Of String)
' Index des aktuell gezeigten Bildes
Private wallpaperIndex As Integer

Beispiel mit Speicherproblem:

PictureBox1.Image = Image.FromFile(wallpaperList(wallpaperIndex))

Beispiel ohne Speicherproblem:

Using fs As New IO.FileStream(wallpaperList(wallpaperIndex), IO.FileMode.Open)
PictureBox1.Image = Image.FromStream(fs)
End Using

Im ersten Beispiel wird zwar das Bild aus der Datei geladen, allerdings bleibt das Handle der Datei geöffnet. Es werden also Resourcen beansprucht, die anschließend nicht wieder freigegeben werden. Das wird umso kritischer, wenn du ein anderes Bild auf die selbe Weise der Image-Eigenschaft zuweist, weil du dann keine Chance mehr hast die Resourcen vom vorherigen Bild mittels Dispose freizugeben. Abhilfe würde also folgende Codezeile vor der Zuweisung eines neuen Bildes schaffen:

If PictureBox1.Image IsNot Nothing Then PictureBox1.Image.Dispose()

Meiner Meinung nach ist das aber zu umständlich und vor allem zu anfällig, wenn man nicht daran denkt. Daher ist das zweite Beispiel übersichtlicher und besser, weil die Using-Direktive eine solche Freigabe mit dem End Using Statement automatisch ausführt.

Ich weiß aber nicht, ob das zur Lösung deines eigentlichen Problemes beiträgt. Ich konnte ein solches Verhalten mit etwa 115 Bildern und einem Interval von 200 ms nicht reproduzieren.

1

Ich kann dir jetzt schonmal sagen, dass deine Frage/Problemstellung keinem einen Einblick in deinen Code verschafft...

Und dir somit niemand helfen kann.

Bitte erklär es mal genauer, und am besten auch mit deinem Code.

Denn z.b weiss man garnicht in welchem Zeitrum er diese 100 Bilder durchlaufen soll, oder ob es einen externen Trigger (z.b einen Button) als Bildwechsel benötigt etc. etc. etc. blablabla

Einfach hier mit ner besseren Fragestellung drauf antworten :)

MFG xGlumi

Taner1998444 
Fragesteller
 22.01.2016, 19:18

Es ist ca 1 Bild pro Sekunde das vom Programm geöffnet wird. (Den Code kann ich hier leider nich posten, da er schon mehrere tausend zeilen lang ist)

0
Taner1998444 
Fragesteller
 22.01.2016, 19:30
@xGlumi

Was mich eigentlich interessiert: Hab ich einen Fehler im Code oder kann das an der Programmiersprache liegen?

0
xGlumi  22.01.2016, 19:46
@Taner1998444

"Hab ich einen Fehler im Code"
OHNE CODE.....

Bitte verstehe -> Ohne Code = Keine Aussage, ob dieser Falsch ist...
Soll man hellsehen?

MFG xGlumi

0
Taner1998444 
Fragesteller
 22.01.2016, 19:56
@xGlumi

Nein, man soll nur sagen ob es theoretisch an VB liegen kann, da ich den Code überprüft habe und relative sicher weiß, dass kein Fehler vorhanden ist. :D

0

Ich kenne deinen Code nicht aber probiere mal nachdem du dass Bild eingefügt hast
Picturebox1.inva
Dann wird was vorgeschlagen dass musst du nehmen (keine Ahnung wie dass heist)

Ansonsten einfach ein bitmap verwenden