我正在使用一个BackgroundWorker来从摄像头中获取视频并写入到WinForms窗体上的PictureBox中。在BW线程中,我只需从摄像头中获取一帧图像,将其放入PictureBox中,执行sleep操作,然后继续执行:
while (CaptureThreadRunning)
{
Thread.Sleep(5);
Image tmp = Camera.GetFrame(500);
pbCameraFeed.Image = tmp;
//this.BeginInvoke(new MethodInvoker(delegate { pbCameraFeed.Image = Camera.GetFrame(500); }));
}
问题在于调整或移动表单时,我的屏幕会抛出异常
System.InvalidOperationException
,并显示消息Additional information: Object is currently in use elsewhere.
,该异常发生在pbCameraFeed.Image = tmp;
这一行。我猜测库正在尝试同时绘制与我的while循环有关的PictureBox内容,因此我切换到了上面注释掉的
this.BeginInvoke
实现。不幸的是,这样会显著降低我的帧率。我在一个非常慢的Mini PC上运行这段代码,这可能是问题的原因之一。我真正想要的是一种可靠地更新GUI图像的方法,而且不会使我的帧率减少近一半。还有其他标准的方法吗?对于这个应用程序来说,BW线程似乎是完美的,但我错过了什么吗?
谢谢。
BeginInvoke
但增加Sleep
时间吗?5 毫秒低于Thread.Sleep
的精度(大约在 15 毫秒左右,取决于操作系统的活动情况),因此你肯定可以增加它。这应该有助于减少负载/延迟。 - Pierre-Luc PineaultCamera.GetFrame(500);
是否是一项昂贵的操作,但简单的计时器是否可以同样发挥作用呢? - LarsTech