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.
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.
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.
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.
Empfohlene Beiträge
Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren
Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können
Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!
Neues Benutzerkonto erstellenAnmelden
Du hast bereits ein Benutzerkonto? Melde Dich hier an.
Jetzt anmelden