我需要在两个不同的线程中获得一个锁才能访问 EmguCv 中的位图(从网络摄像头填充)。我有一个“GetFrame”函数,可以查询相机并将它返回的内容放入 .NET 位图中。我有两个线程需要访问这个位图,一个需要写入位图并将位图分配给图片框,另一个需要读取位图,将其转换为图像对象并将其分配给 EMGU ImageBox。我首先锁定一个任意对象,然后执行我的操作。代码如下(_Camera.LiveFrame为Bitmap):
写/读线程:
while (_CaptureThreadRunning)
{
lock (_Camera)
{
// _Camera.GetFrame writes to the Bitmap
if (_VideoPlaying && _Camera.GetFrame(500))
pbLiveFeed.Invalidate();
}
}
_Camera.CloseCamera(true);
_CaptureExitEvent.Set(); // Set to signal captureThread has finished
阅读/ImageBox 线程:
while (_ProcessThreadRunning)
{
lock (_Camera)
{
// _Camera.LiveFrame is the Bitmap
procImage = new Image<Bgr, int>((Bitmap)_Camera.LiveFrame.Clone());
procImage.Draw(new Rectangle(10,20,20,15),new Bgr(Color.LightGreen), 5);
ibProcessed.Image = procImage;
ibProcessed.Invalidate();
}
}
_ProcessExitEvent.Set();
这在大多数情况下运行良好,但是当我尝试 Clone() 位图时,时不时会出现“对象正在其他地方使用”错误。这不是正确的锁定方式吗?我不明白为什么这会导致问题。
附言。我的线程也不能再优雅地退出。我的循环之外的 .Set() 调用永远不会被调用。我猜线程是死锁的?