Veröffentlicht 12. November 200816 j Guten Abend werte Kollegen. Habe mal zwei kleine Fragen bezüglich der Performance meines Programms. Kurz zu meinem Programm: Mein Programm spielt Bilder in einer Art Diashow ab. Die Dateien holt sich folgender Codeteil aus einer Listbox: Sub shows() Dim k, s, j, Folder As String Dim i As Integer Dim LastStrich, PreLastStrich As Integer For i = 0 To ListBox1.Items.Count - 1 k = ListBox1.Items.Item(i) s = k PictureBox.Image = Image.FromFile(s) 'Extrahieren des Ordners, in dem die Bilder liegen LastStrich = s.LastIndexOf("\") j = s.Substring(0, LastStrich - 1) PreLastStrich = j.LastIndexOf("\") Folder = s.Substring(PreLastStrich + 1, (LastStrich - PreLastStrich) - 1) Ordner.Text = Folder ' Verzögerung bevor nächstes Bild geladen wird Delay(5) 'Überwachung ob Stop-Befehl gesetzt wurde If StopCheck = 1 Then Exit For End If Next Exit Sub End Sub Wenn das Programm läuft, kann ich im Task-Manager verfolgen, wie bei jedem Bildwechsel die Speichernutzung um die Größe des nächsten geladenen Bildes wächst. Beispiel: Speichernutzung 12MB --> Bildwechsel --> Speichernutzung 15 MB Wenn man jetzt hunderte von Bildern in der ListBox hat, könnt ihr euch denken was passiert... 1.FRAGE: Wie kann ich dieses Verhalten ändern und den Speicher der bereits gezeigten Bilder wieder freigeben? 2.FRAGE: Warum liegt die Prozessorlast meines Prozesses bei laufender Diashow bei 50 %? (Zur Info, ich hab nen Intel E8500 Core2Duo). Kann man das irgendwie performancesparender programmieren? Vielen Dank schonmal.
12. November 200816 j 1.FRAGE: Wie kann ich dieses Verhalten ändern und den Speicher der bereits gezeigten Bilder wieder freigeben? Brauchst du eigentlich nicht da sich der Garbage Collector darum kümmert und den allerspätestens freigibt sobald er benötigt wird. 2.FRAGE: Warum liegt die Prozessorlast meines Prozesses bei laufender Diashow bei 50 %? (Zur Info, ich hab nen Intel E8500 Core2Duo). Kann man das irgendwie performancesparender programmieren? Das wird daran liegen das dein Programm andauernd arbeitet und Delay anscheinend nicht wie Sleep ohne Prozessorlast wartet. Ich glaube da gabs in VB eine Funktion mit der man sagen konnte das Windows jetzt Zeit für andere Dinge hat, ich weiß aber nicht wie die heißt. Eine andere Möglichkeit wäre das über einen Timer zu machen der alle 5 Sekunden das Bild wechselt.
13. November 200816 j Moin! Hast Du mal versucht das "alte" Bild mit Dispose() frei zu geben, nachdem das neue geladen wurde? Möglicherweise bemerkt der garbage collector sonst nicht schnell genug, daß die Bitmap nicht mehr gebraucht wird, Wenn der Speicher wirklich extrem zugemüllt wird könntest Du noch versuchen gc.collect(); aufzurufen und so den gc zum aufräumen zu zwingen. Das kostet aber gut Leistung (habe im Netz etwas von 70% gelesen und eigene Versuche haben eine starke Verzögerung ergeben) und sollte wirklich nur in Notfällen versucht werden.
13. November 200816 j Du solltest den Garbage Collector gar nicht selber aufrufen und selbst wenn du es tust heißt das noch lange nicht das er dann auch aufräumt. Wie gesagt der Speicher wird spätestens dann freigegeben wenn er benötigt wird.
Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.