2012-06-06 19 views
6

Tengo un hilo que genera continuamente mapas de bits y toma una captura de pantalla de la ventana de otro programa. Ahora, tengo un pictureBox en mi formulario, y eso se actualiza constantemente con los mapas de bits generados. Aquí está el código que tengo en el hilo:La creación continua de mapas de bits lleva a la pérdida de memoria

 Bitmap bitmap = null; 

     while (true) 
     { 
      if (listBoxIndex != -1) 
      { 
       Rectangle rect = windowRects[listBoxIndex]; 
       bitmap = new Bitmap(rect.Width, rect.Height); 
       Graphics g = Graphics.FromImage(bitmap); 
       IntPtr hdc = g.GetHdc(); 
       PrintWindow(windows[listBoxIndex], hdc, 0); 
       pictureBox1.Image = bitmap; 
       g.ReleaseHdc(hdc); 
      } 
     } 

Como se puede ver, esto conduce a una pérdida de memoria, debido a la continua llamada a la nueva Bitmap (rect.width, rect.height). He intentado agregar "bitmap.Dispose()" a la parte inferior del ciclo while, pero eso lleva a que también se elimine la imagen de pictureBox, lo que hace una X roja gigante en lugar de la imagen real. ¿Hay alguna forma de que pueda deshacerme del "mapa de bits" sin deshacerme de la imagen PictureBox?

Respuesta

10

También está "perdiendo" el objeto Graphics. Prueba esto:

while (true) 
    { 
     if (listBoxIndex != -1) 
     { 
      Rectangle rect = windowRects[listBoxIndex]; 
      Bitmap bitmap = new Bitmap(rect.Width, rect.Height); 
      using (Graphics g = Graphics.FromImage(bitmap)) 
      { 
       IntPtr hdc = g.GetHdc(); 
       try 
       { 
        PrintWindow(windows[listBoxIndex], hdc, 0); 
       } 
       finally 
       { 
        g.ReleaseHdc(hdc); 
       } 
      } 
      if (pictureBox1.Image != null) 
      { 
       pictureBox1.Image.Dispose(); 
      } 
      pictureBox1.Image = bitmap; 
     } 
    } 
+0

Oh, eso es correcto. ¿Cómo se me pasó la palabra clave using? Modifiqué mi código ¡Gracias! – user1440308

+0

'using' el mapa de bits lo eliminará después de asignarlo a su' PictureBox', que es lo que hace que el mapa de bits se vuelva inaccesible en primer lugar. Debe mantener el mapa de bits activo mientras dure su visualización en el 'PictureBox'. – Lucero

+0

@ xmenW.K. ¿Qué exactamente no es verdad? 'Image.Dispose()' libera el puntero de la imagen nativa, puede verificar la fuente usted mismo. – Lucero

1

El ejemplo contestado tiene una fuga con gráficos g después g.ReleaseHdc(..);

Recuerde dipose los gráficos variables

como por ejemplo:

g.Dispose(); 
Cuestiones relacionadas