7

我有一个线程不断生成位图并截取另一个程序窗口的屏幕截图。现在,我的表单上有一个图片框,它会随着生成的位图不断更新。这是我在线程中的代码:

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

如您所见,这会导致内存泄漏,因为不断调用 new Bitmap(rect.Width, rect.Height)。我尝试将“bitmap.Dispose()”添加到 while 循环的底部,但这会导致 pictureBox 的图像也被处理,这使得一个巨大的红色 X 代替了实际图像。有什么方法可以在不处理图片框图像的情况下处理“位图”?

4

2 回答 2

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;
        }
    }
于 2012-06-06T16:51:33.873 回答
1

已回答的示例在 Graphics g 之后有泄漏g.ReleaseHdc(..);

记得配置图形变量

例如:

g.Dispose();
于 2012-11-27T17:43:39.543 回答