Picturebox获得大红色X但我无法检测或修复它

C S*_*ith 9 c# picturebox thread-safety aforge winforms

我目前正在与AForge合作,并有一个新的帧事件,将帧作为位图发布到图片框中.它有90%的时间很棒......除非我在winform上捣乱.更改组合框,移动窗口或任何类似的风险会导致Picturebox从视频切换到大红色X.下面的代码示例:

    private void connectButton_Click(object sender, EventArgs e)
    {
        try
        {
            cam = new VideoCaptureDevice(captureDevices[CameraSelectComboBox.SelectedIndex].MonikerString);
            cam.NewFrame -= Handle_New_Frame; //Just to avoid the possibility of a second event handler being put on
            cam.NewFrame += new AForge.Video.NewFrameEventHandler(Handle_New_Frame);
            cam.Start();
        }
        catch
        {
            MessageBox.Show("An error has occured with connecting to the specified webcam. The application will now close!");
            Application.Exit();
        }
    }

    private void Handle_New_Frame(object sender, NewFrameEventArgs eventArgs)
    {

        try
        {
            if (bitmap != null)
                bitmap.Dispose(); //Without this, memory goes nuts
            bitmap = new Bitmap(eventArgs.Frame);
        }
        catch { }

        //Draw some stuff on the images
        bitmap = AdjustBrightness(bitmap, brightnessMeter);
        bitmap = ApplyContrast(contrastMeter, bitmap);
        bitmap = Draw_Top_Line(bitmap);
        bitmap = Draw_Bottom_Line(bitmap);

        //Set the image into the picturebox
        this.Invoke((MethodInvoker)delegate
        {
            videoPictureBox1.Image = bitmap;
            frameRate++; //Keep track of the frame rate
        });

        GC.Collect(); //Without this, memory goes nuts

        this.Invoke((MethodInvoker)delegate {
            videoPictureBox1.Refresh(); //NOT NECESSARY. JUST TRYING TO FIX THE BIG RED X!
        });

        if (videoPictureBox1.Image == videoPictureBox1.ErrorImage)
        {
            cam.Stop(); //ALSO NOT NECESSARY> AGAIN, JUST TRYING TO FIX THE BIG RED X!
            cam.Start();
        }
    }
Run Code Online (Sandbox Code Playgroud)

我在if(videoPictureBox1.Image == videoPictureBox1.ErrorImage)上放了一个中断,即使大红色X上升,它也会评估为false,因为图像实际上是设置为位图.所以cam.Stop()和cam.Start()永远不会运行(不确定这是否会有所帮助,但我想我会尝试一下).

videoPictureBox1.Refresh()每次都在运行,但是再次 - 它没有什么区别.还有大红X.

正如我之前所说:如果我开始播放视频并且什么都不触摸,那么大红色的X将永远不会发生.但是当我开始更改组合框或者拖动表单本身时,大红色X的几率呈指数上升.有时我可以在它发生之前翻阅组合框10-12次,有时它会在第二次点击组合框时发生.: - \

任何人都可以解释这里发生的事情,也许可以提出一个关于修复它的最佳方法的建议吗?我还是很新的线程,所以我一直在努力解决这里发生的事情以及解决问题的最佳方法!任何朝着正确方向的推动都将是一个巨大的帮助!

C S*_*ith 6

最后,我在调用Handle_New_Frame中包装了所有内容.它永久地完全消除了大红色X问题.> _>

private void Handle_New_Frame(object sender, NewFrameEventArgs eventArgs)
{
  this.Invoke((MethodInvoker)delegate
  {
    try
    {
        if (bitmap != null)
        {
            bitmap.Dispose(); //Without this, memory goes nuts
        }

        bitmap = new Bitmap(eventArgs.Frame);
    }
    catch { }

    //Draw some stuff on the images
    bitmap = AdjustBrightness(bitmap, brightnessMeter);
    bitmap = ApplyContrast(contrastMeter, bitmap);
    bitmap = Draw_Top_Line(bitmap);
    bitmap = Draw_Bottom_Line(bitmap);

    //Set the image into the picturebox
    this.Invoke((MethodInvoker)delegate
    {
        videoPictureBox1.Image = bitmap;
        frameRate++; //Keep track of the frame rate
    });

    GC.Collect(); //Without this, memory goes nuts
  });
}
Run Code Online (Sandbox Code Playgroud)


Mar*_*uer 6

肖恩哈格里夫斯拥有出色的,简洁的书面记录的“厄运的大红色的X”的。我发现它在处理突然显示红色“X”的 WinForm 组件的一般情况下非常有用。

总之:

  • 这是由控件从OnPaint事件中抛出异常引起的。
  • 一旦抛出,该控件将继续显示红色 X 并跳过射击 OnPaint.
  • 要进行调试,请将调试器设置为捕获公共语言运行时异常,然后执行您通常所做的任何操作来获得红色 X。调试器将在它发生的地方停止,让您可以进行调查并希望找到一种方法来防止它发生。

  • 链接已损坏。更新链接:http://www.shawnhargreaves.com/blog/winforms-and-the-big-red-x-of-doom.html (2认同)