在我的kinect应用程序中,我有主线程,它负责UI线程和其他线程之间的通信。我无法复制从kinect生成的WriteableBitmap,并通过EmguCV处理将此WriteableBitmap图像传递给分离的线程。我尝试了一切:克隆,CloneCurrentValue, BlockingCollection,但总有一些问题,如:
调用线程不能访问这个对象,因为一个不同的线程拥有
或者处理数据错误。这是我的应用程序中的主循环;
WritableBitmap color; WritableBitmap depth; while (true) { kinect.updateFrames(); ctrlMainWindow.Dispatcher.BeginInvoke(new Action(() => { color = kinect.video.getBitmapColor(); depth = kinect.video.getBitmapDepth(); })); updateDetectors(color,depth); // Other thread }
如果没有一个好的,最小的, 完整的代码示例来可靠地再现问题,即使不是不可能,也很难知道确切的问题是什么,更不用说如何修复它了。said…
您可能已经注意到,WriteableBitmap
继承了DispatcherObject
,并且必须只能在拥有它的调度程序线程内访问。
可以推测,对kinect.updateFrames()
的调用实际上是创建对象的过程,因此一个明显的解决方案是在被调用的匿名方法中调用方法,而不是在它之前调用
如果由于某种原因,这是不可行的,另一种选择是冻结位图之前,试图在错误的线程中使用它们。例如:
kinect.updateFrames();
color = kinect.video.getBitmapColor();
depth = kinect.video.getBitmapDepth();
color.Freeze();
depth.Freeze();
ctrlMainWindow.Dispatcher.BeginInvoke(new Action(() =>
{
// use color and depth in other thread
}));
禁止任何,你可以直接访问位图的数据(例如CopyPixels()
或Lock()
/BackBuffer
),并使用该数据在正确的线程上创建新的位图。
如果以上都对你没有帮助,请提供一个好的代码示例,如上面提供的链接所述。