2012-06-06 20 views
6

我有一个线程可以连续生成位图并获取另一个程序窗口的屏幕截图。现在,我的表单上有一个pictureBox,并且不断更新生成的位图。下面是我在线程的代码:连续创建位图会导致内存泄漏

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

正如你所看到的,这会导致内存泄漏,因为连续呼叫转接至新位图(rect.Width,rect.Height)的。我已经尝试在while循环的底部添加“bitmap.Dispose()”,但导致pictureBox的图像也被丢弃,这使得巨大的红色X代替实际的图像。有没有办法处理“位图”而不处理pictureBox图像?

回答

10

你也在“泄漏”Graphics对象。试试这个:

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

哦,这是正确的。 using关键字如何漏掉我的脑海?我修改了我的代码。谢谢! – user1440308

+0

'使用'位图会在将它分配到您的'PictureBox'之后处理它,这就是导致位图首先变得无法访问的原因。您需要保持位图在“PictureBox”上显示的持续时间。 – Lucero

+0

@ xmenW.K。究竟是不是真的? 'Image.Dispose()'释放本地图像指针,你可以自己检查源。 – Lucero

1

的回答例子有图形摹 泄漏后g.ReleaseHdc(..);

记住dipose图形变量

,例如:

g.Dispose();