gpt4 book ai didi

c# - 在后台使用非托管库时无法更新 WPF GUI

转载 作者:行者123 更新时间:2023-11-30 18:05:19 30 4
gpt4 key购买 nike

我在尝试使用 Emgu 从网络摄像头捕获图像时遇到了一个问题。为完成这项任务,Emgu 使用非托管 opencv 库。所以问题是我无法从 System.Timers.Timer Elapsed 事件更新我的 GUI(WPF 图像控件)。我知道它在不同的线程中运行,但是嘿,这就是我使用 Dispatcher 的原因。这是我第一次无法使用 Dispatcher 完成它。获取 InvalidOperationException 并显示“调用线程无法访问此对象,因为另一个线程拥有它。”。我花了一整天的时间寻找解决方案,但仍然无法解决。知道为什么会这样吗?

webcam.OnNewFrame += newBitmapSource => this.imgCaptured.Dispatcher.Invoke
(
new Action(delegate
{
this.imgCaptured.Source = newBitmapSource;
}),
DispatcherPriority.Background
);

Stack Trace 上的最后一件事是:System.Windows.Threading.Dispatcher.VerifyAccess()

但是,如果我调用 Dispatcher.CheckAccess(),它会返回 true。

更新:

最后我自己发现了:BitmapSource 必须在 UI Thread 上创建。似乎它不能以其他方式使用此对象。

最佳答案

您是否尝试将其设置为非后台线程。我想知道这是否是一个问题 - 从后台线程更新 UI。

另外,它说您必须先卡住位图资源,然后才能尝试在不同线程(工作线程和 UI 线程)之间共享它们。请参阅以下链接。

WPF Dispatcher {"The calling thread cannot access this object because a different thread owns it."}

http://social.msdn.microsoft.com/Forums/en-US/windowswic/thread/9223743a-e9ae-4301-b8a4-96dc2335b686

关于c# - 在后台使用非托管库时无法更新 WPF GUI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5704080/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com