Soy un recién llegado en C#. Tengo que actualizar varias veces un cuadro de imagen GUI en un hilo de trabajo. La imagen se adquiere desde una cámara que está sondeando un controlador con un método GetImage que recupera la imagen que se mostrará. Incluso si asigno el mapa de bits utilizando la directiva "using" y llamo explícitamente a G.C, la memoria parece que nunca se desasigna.C# picturebox liberación de memoria problema
El subproceso de trabajo es algo como esto:
while (true)
{
// request image with IR signal values (array of UInt16)
image = axLVCam.GetImage(0);
lut = axLVCam.GetLUT(1);
DrawPicture(image, lut);
//GC.Collect();
}
Mientras que el método DrawPicture es algo así como
public void DrawPicture(object image, object lut)
{
[...]
// We have an image - cast it to proper type
System.UInt16[,] im = image as System.UInt16[,];
float[] lutTempConversion = lut as float[];
int lngWidthIrImage = im.GetLength(0);
int lngHeightIrImage = im.GetLength(1);
using (Bitmap bmp = new Bitmap(lngWidthIrImage, lngHeightIrImage)) {
[...many operation on bitmap pixel...]
// Bitmap is ready - update image control
//SetControlPropertyThreadSafe(tempTxtBox, "Text", string.Format("{0:0.#}", lutTempConversion[im[160, 100]]));
//tempTxtBox.Text = string.Format("{0:00000}", im[160, 100]);
//System.Drawing.Image.FromHbitmap(bmp.GetHbitmap());
pic.Image = System.Drawing.Image.FromHbitmap(bmp.GetHbitmap());
}
}
problemas surge con la
pic.Image = System.Drawing .Image.FromHbitmap (bmp.GetHbitmap());
De hecho, al comentar esa línea de código, la recolección de basura funciona como lo haría. mejor, el problema parece ser con
System.Drawing.Image.FromHbitmap (bmp.GetHbitmap())
Algún consejo para resolver esta pérdida de memoria?
¡Muchas gracias!
El problema es que no está deshaciéndose de un objeto GDI. –
@Yannick: buen punto. Imagino que ambos problemas crean problemas para el recolector de basura. –
De hecho, al invocar Dispose on Image descarta los recursos no administrados que se asignan al llamar a 'FromHbitmap()'. Sin embargo, la solución actual ignora el objeto GDI no administrado creado al llamar a 'GetHbitmap()'. –