2016-08-18 4 views
0

Ich bekomme Frames von OpenCV Emgu in C# und ich habe nach einiger Zeit keinen Speicher mehr. Das Problem verschwindet, wenn ich den alten Rahmen manuell entsorge. Das passiert nur, wenn ich die Frames von Emgu bekomme. Wenn ich zum Beispiel Frames von AForge bekomme, wird es wie erwartet aufgeräumt.Warum wird kein Bild von GC entsorgt?

Da ich eine Kopie der Daten in CopyToNewBPP mache und den Rahmen aus dem Capture entsorgen, sollte der Speicher in unmanaged freigegeben werden. Und wenn ich ein neues Bitmap in der Bildbox anlege, sollte es keine Verweise auf den alten Rahmen geben.

Frage ist was fehlt mir in meinem Verständnis.

private void button1_Click(object sender, EventArgs e) 
    { 
     Capture capture = new Capture("rtsp://192.168.0.89:554/live2.sdp"); 

     Task t = new Task(() => 
     { 
      DateTime last = DateTime.Now; 
      while (true) 
      { 
       var frame = capture.QueryFrame(); 
       if (frame == null) 
       { 
        continue; 
       } 

       Bitmap bitmap = CopyToNewBPP((Bitmap)frame.Bitmap); 
       frame.Dispose(); 

       pictureBox1.Invoke(new MethodInvoker(() => 
       { 
        var old = pictureBox1.Image; 
        pictureBox1.Image = bitmap; 
        if (old != null) 
        { 
         old.Dispose(); // this should be done automatically by GC in my mind 
        } 
       })); 
       frame.Dispose(); 
      } 
     }); 
     t.Start(); 
    } 

    public Bitmap CopyToNewBPP(Bitmap orig, PixelFormat format = PixelFormat.Format32bppRgb) 
    { 
     Bitmap clone = new Bitmap(orig.Width, orig.Height, format); 
     using (Graphics gr = Graphics.FromImage(clone)) 
     { 
      gr.DrawImage(orig, new Rectangle(0, 0, clone.Width, clone.Height)); 
     } 
     return clone; 
    } 
+0

Sieht so aus, als ob ich das selbst herausgefunden habe. Das Problem ist, dass ich Frames so schnell bekomme, dass ich den Speicher auffülle, bevor GC ausgeführt werden soll. Hinzufügen von GC.Collect(); In der Schleife wird die Speicherbelegung niedrig gehalten, aber die Quelle verwendet die Dispose-Methode, da diese viel schneller ist. – klundby

Antwort

0

Ich weiß nicht, ob meine Antwort vielleicht

Bild Gui Programm helfen, das Gedächtnis lecken wichtig ist.

z. B. Code.

if(pictureBox.Image != null) 
{ 
    pictureBox.Image.Dispose(); 
    pictureBox.Image = null; 
    pictureBox.Image = [New Image]; 
} 
+0

Das ist etwas, was ich habe, das "Problem" ist, dass GC das Bild selbst entsorgen sollte, da es keine Referenzen mehr gibt – klundby

Verwandte Themen