7

ビットマップを継続的に生成し、別のプログラムのウィンドウのスクリーンショットを撮るスレッドがあります。現在、フォームに 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);
            }
        }

ご覧のとおり、これは new Bitmap(rect.Width, rect.Height) への継続的な呼び出しのため、メモリ リークにつながります。「bitmap.Dispose()」を while ループの一番下に追加しようとしましたが、これにより、pictureBox の画像も破棄され、実際の画像の代わりに巨大な赤い X が表示されます。pictureBox イメージを破棄せずに「ビットマップ」を破棄する方法はありますか?

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 に答える