我正在使用.Net 3.5和 OpenCV 1.1 编写程序。我有多个线程需要从我的计算机上的网络摄像头获取图像变量,问题是当多个线程同时尝试访问摄像头时,我得到内存违规错误。我知道我可以使用PostThreadMessage和GetMessage向线程发送变量。任何人都可以给我一个教程或示例,说明如何使用PostThreadMessage
和GetMessage
将变量传递给线程吗?
我得到的错误是内存访问冲突错误,当我的两个工作线程都试图调用从相机获取图像的函数时。我想通过让一个线程为所有其他线程获取图像来解决这个问题。它们每个都有一个 IplImage 变量,用于存储相机捕获的图像。希望这可以帮助。
答案 0 :(得分: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);)应该可以修复你的碰撞..但听起来你的代码可以用更多的组织来做..
答案 1 :(得分:0)
内存错误发生在哪里?你能发一些更详细的信息吗?它们是在访问您的数据结构还是访问OpenCV时发生的?如果是后者,那么我不确定消息传递是如何起作用的。在任何一种情况下,围绕非线程安全数据结构的一点点锁定听起来就足够了。