문제

나는 뉴 비 C#.를 반복적으로 새로 고침 GUI 그림자에서 worker thread.이미지를 취득한 카메라에서 투표 드라이버 GetImage 는 방법 retrives 이미지를 표시할 수 있습니다.는 경우에도 나는 할당을 비트맵 사용하는 지시어를 사용하여""그리고 명시적으로 호출 G.C,메모리가 될 것 같지 않 할당 해제됩니다.

Worker 쓰레드가 뭔가 다음과 같다:

   while (true)
    {
        // request image with IR signal values (array of UInt16)
        image = axLVCam.GetImage(0);
        lut = axLVCam.GetLUT(1);
        DrawPicture(image, lut);
        //GC.Collect();

    }

동 DrawPicture 방법은 뭔가

   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());
    }
}

문제가 발생합

pic.지지 시스템입니다.Drawing.이미지입니다.FromHbitmap(bmp.GetHbitmap());

사실에서 코멘트는 코드 라인,가비지 컬렉션으로 작동합니다.더 나은,문제는 것으로 보인

시스템입니다.Drawing.이미지입니다.FromHbitmap(bmp.GetHbitmap())

어떤 조언을 해결하는 이 메모리 누수가?

많은 감사!

도움이 되었습니까?

해결책

Image 구현 IDisposable, 당신은 전화해야합니다 Dispose 각각에 Image 더 이상 필요하지 않을 때 생성 한 인스턴스. 코드 에서이 라인을 교체하려고 시도 할 수 있습니다.

pic.Image = System.Drawing.Image.FromHbitmap(bmp.GetHbitmap());

이것으로 :

if (pic.Image != null)
{
    pic.Image.Dispose();
}
pic.Image = System.Drawing.Image.FromHbitmap(bmp.GetHbitmap());

새 이미지가 할당되기 전에 이전 이미지 (있는 경우)를 처리합니다.

다른 팁

는 것입니다,당신 GDI 트맵 bmp 와 GetHbitmap,에 따라 사용됩니다.

당신이에 대한 책임은 전화 GDI DeleteObject 방법을 무료 open icecat 콘텐츠 배포업체를 통해 사용됩 GDI 트맵 개체입니다.

다음 FromHbitmap 방법의 복사본을 만들어 GDI 비트맵그래서 당신은 해제할 수 있습 들어오는 GDI 를 사용하여 비트맵 GDI DeleteObject 방법을 만든 후 즉시 새로운 이미지입니다.

그래서 기본적으로 추가:

[System.Runtime.InteropServices.DllImport("gdi32.dll")]
public static extern bool DeleteObject(IntPtr hObject);

...

IntPtr gdiBitmap = bmp.GetHbitmap();

// Release the copied GDI bitmap
if (pic.Image != null)
{
    pic.Image.Dispose();
}

pic.Image = System.Drawing.Image.FromHbitmap(gdiBitmap);

// Release the current GDI bitmap
DeleteObject(gdiBitmap);

내가 잘 모르는 경우에 당신을 필요로 하는 비트맵을 수행하는 어떤 종류의 변화입니다.하지 않는 경우에 당신은 수당 비트맵 이미지의 재산의 PictureBox,을 무시하고 전 솔루션:

// Since we're not using unmanaged resources anymore, explicitly disposing 
// the Image only results in more immediate garbage collection, there wouldn't 
// actually be a memory leak if you forget to dispose.
if (pic.Image != null)
{
    pic.Image.Dispose();
}

pic.Image = bmp;

Pbox에서 이미지를 해제하는 방법에는 여러 가지가 있습니다. 나는 사용하지 않는 방법을 강력히 추천합니다. pbox.Image = Image.FromFile.... Filestream을 사용하지 않고 파일에서 BitMap 클래스를 사용하여 읽으려면 읽으십시오. 이와 같이:

Bitmap bmp = new Bitmap(fileName);
pbox.Image = bmp; // notice that we used bitmap class to initialize pbox.

... 그리고 이미지 파일을 해제하고 싶습니다. bmp.Dispose();
이제 파일에 원하는 것을 삭제, 이동 또는 원하는 것을 삭제할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top