【问题标题】:OpenCV Multi-Threaded Thread MessageOpenCV 多线程线程消息
【发布时间】:2010-12-11 08:12:02
【问题描述】:
我正在使用 .Net 3.5 和 OpenCV 1.1 编写程序。我有多个线程需要从计算机上的网络摄像头获取图像变量,问题是当多个线程尝试同时访问摄像头时出现内存冲突错误。我知道我可以使用 PostThreadMessage 和 GetMessage 将变量发送到线程。谁能给我一个教程或示例,说明如何在线程运行时使用PostThreadMessage 和GetMessage 将变量传递给它?
当我的两个工作线程尝试调用从相机获取图像的函数时,我得到的错误是内存访问冲突错误。我想通过让一个线程获取所有其他线程的图像来解决这个问题。它们每个都有一个 IplImage 变量,用于存储相机捕获的图像。希望这可以帮助。
【问题讨论】:
标签:
.net
c++
multithreading
opencv
message-passing
【解决方案1】:
内存错误发生在哪里?你能发布一些更详细的信息吗?它们是在访问您的数据结构还是访问 OpenCV 数据结构期间发生的?如果是后者,那么我不确定消息传递将如何提供帮助。在任何一种情况下,对非线程安全数据结构进行一点锁定听起来就足够了。
【解决方案2】:
我要在这里冒个险,假设您想以串行方式复制相机图像,然后以多线程方式对复制的数据(IplImage)进行操作。
为了安全地执行此操作,正如不知名人士指出的那样,您必须锁定您可能使用线程访问的内存(或变量)。如何使用 Windows CRITICAL_SECTION 执行此操作的一个非常简短的示例如下:
CRITICAL_SECTION cs;
/* Initialize the critical section -- This must be done before locking */
InitializeCriticalSection(&cs);
...
/* Release system object when all finished --
usually at the end of the cleanup code */
DeleteCriticalSection(&cs);
现在,当您访问相机(或任何不可共享的资源)时,您只需用以下两行包围您正在访问的东西:
EnterCriticalSection(&cs);
/* Operate on your shared data */
LeaveCriticalSection(&cs);
用这两行包围你的代码(例如 IplImage* frame = cvQueryFrame(xyz);)应该可以解决你的冲突。但听起来你的代码可以做更多的组织。