musicjoern Geschrieben 12. November 2008 Geschrieben 12. November 2008 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. Zitieren
Guybrush Threepwood Geschrieben 12. November 2008 Geschrieben 12. November 2008 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. Zitieren
Pointerman Geschrieben 13. November 2008 Geschrieben 13. November 2008 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. Zitieren
Guybrush Threepwood Geschrieben 13. November 2008 Geschrieben 13. November 2008 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. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.