Opencv - 如何使用与许多线程共享的imshow()方法使用相同的窗口

时间:2014-09-15 11:40:20

标签: c++ multithreading opencv

我的代码有时有效,有时无法正常工作。基本上我创建了一个线程池,它应该在一个窗口中显示图像。为了达到这个效果,每组线程方法调用imshow(windowName)具有相同的名称(windowName变量)。因此每个线程组都有一个特定的窗口,应该显示图像。

但是,在运行应用程序时,有时会向同一个线程组显示多个窗口。我相信应该发生的事情是第一个线程准备窗口,然后更改状态让位给另一个线程,然后第二个线程准备另一个窗口(因为第一个尚未准备好),并且在完成所有过程后出现两个窗口。

确保只有第一个线程启动imshow()的好方法是什么? 也许这种方法是错误的或不是很好的解决方案,我想知道这个!

部分代码如下:

    int processVideo(char * videoFileName, char * projectNameIn, vector<SelectedRegion> * v_region, char * configPar) {

        char mainWindowName[100];
        static char threadWindow[sizeof(mainWindowName)];
        //Some code here
        sprintf_s(mainWindowName, "ImageProc[Thread Session ID: %00d]", config.threadGroupSession);
        //Some code here
        cv::Mat videoFrameFeed;

        while(capture.read(videoFrameFeed) && !terminateApp){
            //Some code here
            imshow(mainWindowName, videoFrameFeed);
            //Some code here
        }
   }

1 个答案:

答案 0 :(得分:0)

在阅读了一些评论之后,我创建了一个锁线程会话来解决。工作良好。我会把下面的代码用来帮助别人。

//Global Variable
bool global_llock_for_thread = false;

void look_session_image_proc(){
    while(global_llock_for_thread){
        //wait for unlook;
    }

    global_llock_for_thread = true;
}

void unlook_session_image_proc(){
    global_llock_for_thread = false;
}

之后我在下面添加代码。

while(capture.read(videoFrameFeed) && !terminateApp){
    //Some code here
    unlook_session_image_proc();

    imshow(mainWindowName, videoFrameFeed);

    unlook_session_image_proc();

    //Some code here
}