我的代码有时有效,有时无法正常工作。基本上我创建了一个线程池,它应该在一个窗口中显示图像。为了达到这个效果,每组线程方法调用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
}
}
答案 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
}