我在尝试使用 Emgu 从网络摄像头捕获图像时遇到了问题。为了完成此任务,Emgu 使用非托管 opencv 库。所以问题是我无法从 System.Timers.Timer Elapsed 事件更新我的 GUI(WPF 图像控件)。我知道它在不同的线程中运行,但是嘿,这就是我使用调度程序的原因。这是我第一次用 Dispatcher 做不到。收到 InvalidOperationException 并显示“调用线程无法访问此对象,因为另一个线程拥有它。”。我花了一整天的时间寻找解决方案,但仍然无法解决。任何想法为什么会发生?
webcam.OnNewFrame += newBitmapSource => this.imgCaptured.Dispatcher.Invoke
(
new Action(delegate
{
this.imgCaptured.Source = newBitmapSource;
}),
DispatcherPriority.Background
);
堆栈跟踪上的最后一件事是:System.Windows.Threading.Dispatcher.VerifyAccess()
但是,如果我调用 Dispatcher.CheckAccess() 它会返回 true。
UPDATE:
最后我自己发现了:BitmapSource必须在UI线程上创建。看来它不能以其他方式使用这个对象。
您是否尝试将其设置为非后台线程。我想知道这是否是一个问题 - 从后台线程更新 UI。
另外,它表示您必须先冻结位图资源,然后再尝试在不同线程(工作线程和 UI 线程)之间共享它们。请参阅以下链接。
WPF Dispatcher {“调用线程无法访问此对象,因为另一个线程拥有它。”} https://stackoverflow.com/questions/2982498/wpf-dispatcher-the-calling-thread-cannot-access-this-object-because-a-different
http://social.msdn.microsoft.com/Forums/en-US/windowswic/thread/9223743a-e9ae-4301-b8a4-96dc2335b686 http://social.msdn.microsoft.com/Forums/en-US/windowswic/thread/9223743a-e9ae-4301-b8a4-96dc2335b686
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)