dipps
Goto Top

C-Sharp App füllt bei Bilderwechsel den RAM

Ich habe mit C# eine Kleine Diashow gebastelt.
 private void timer1_Tick(object sender, EventArgs e)
        {
            cou = listBox1.SelectedIndex;
            
            //pictureBox1.Image = imageList1.Images[cou];
            
            
            cou++;
            if (cou > imageList1.Images.Count-1)
                cou = 0;

            listBox1.SelectedIndex = cou;
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            if (textBox1.Text != "" && Convert.ToInt32(textBox1.Text) > 0)  
                timer1.Interval = Convert.ToInt32(textBox1.Text) * 1000;
        }

        private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
             
            pictureBox1.Image = Image.FromFile(bildpfad[listBox1.SelectedIndex]);
            Properties.Settings.Default.Dia = listBox1.SelectedIndex;
        }
    }
Nun bekomme ich immer nach einiger Zeit Wenn der RAM bei 6GB ist {"Nicht genügend Arbeitsspeicher."} bei pictureBox1.Image = Image.FromFile(bildpfad[listBox1.SelectedIndex]);

Wie kann ich den RAM vorher wieder leeren?

Content-ID: 324310

Url: https://administrator.de/contentid/324310

Ausgedruckt am: 05.11.2024 um 14:11 Uhr

emeriks
emeriks 20.12.2016 um 07:52:12 Uhr
Goto Top
Hi,
Du könntest versuchen, in Zeile 24 ein
pictureBox1.Image.Dispose
einzubauen.
Oder evtl. auch ein
GC.Collect()
z.B. in Zeile 25 einschieben, oder zeitgsteuert aufrufen.

E.
MrFlow
MrFlow 20.12.2016 um 07:55:43 Uhr
Goto Top
Hallo,

Zitat von @emeriks:

Hi,
Du könntest versuchen, in Zeile 24 ein
> pictureBox1.Image.Dispose
> 
einzubauen.
Oder evtl. auch ein
> GC.Collect()
> 
z.B. in Zeile 25 einschieben, oder zeitgsteuert aufrufen.

E.

du möchtest die Image Dispose Variante nehmen ...

Wie wird die ImageList gefüllt?

Grüße
131381
131381 20.12.2016 aktualisiert um 09:20:39 Uhr
Goto Top
Zitat von @MrFlow:
du möchtest die Image Dispose Variante nehmen ...
Nicht zwingend, statt explizit Dispose aufzurufen macht man sowas heutzutage eher mit einem Using-Konstrukt für das Bild und dessen Laufzeit. Es wird dann automatisch freigegeben.

Aber Zweifelsfrei ist das oben dadurch ein MemoryLeak wenn Bildobjekte erstellt aber nicht freigegeben werden.

Gruß mik
emeriks
emeriks 20.12.2016 um 09:41:11 Uhr
Goto Top
Nicht zwingend, statt explizit Dispose aufzurufen macht man sowas heutzutage eher mit einem Using-Konstrukt für das Bild und dessen Laufzeit. Es wird dann automatisch freigegeben.
Ja, richtig, aber hier nicht praktikabel. Wie willst Du das hier implementieren?
131381
131381 20.12.2016 aktualisiert um 10:03:08 Uhr
Goto Top
Hast recht, Kleinigkeit überlesen, sorry.

Aber anstatt die Eigenschaft der Imagebox direkt nach der Zuweisung zu Disposen was ja die Anzeige löschen würde sollte er entweder das Bild einer globalen Variable zuweisen welche er z.B. vor dem neu setzen disposed bzw neu zuweist.
Aber ich denke mal du meintest mit Zeile 24 das er es vor und nicht nach Zeile 24 setzt.
emeriks
emeriks 20.12.2016 um 11:23:11 Uhr
Goto Top
Aber ich denke mal du meintest mit Zeile 24 das er es vor und nicht nach Zeile 24 setzt.
Korrekt.