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-Key: 324310

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

Printed on: April 20, 2024 at 00:04 o'clock

Member: emeriks
emeriks Dec 20, 2016 at 06:52:12 (UTC)
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.
Member: MrFlow
MrFlow Dec 20, 2016 at 06:55:43 (UTC)
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
Mitglied: 131381
131381 Dec 20, 2016 updated at 08:20:39 (UTC)
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
Member: emeriks
emeriks Dec 20, 2016 at 08:41:11 (UTC)
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?
Mitglied: 131381
131381 Dec 20, 2016 updated at 09:03:08 (UTC)
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.
Member: emeriks
emeriks Dec 20, 2016 at 10:23:11 (UTC)
Goto Top
Aber ich denke mal du meintest mit Zeile 24 das er es vor und nicht nach Zeile 24 setzt.
Korrekt.