Мой код ниже работает иногда, и иногда он работает не так, как ожидалось. В основном я создал пул потоков, которые должны представлять изображения в одном окне. Чтобы добиться этого эффекта, каждая группа методов потоков вызывает 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
}
}
После прочтения некоторых комментариев я создаю один сеанс потока блокировки для решения. Работает отлично. Я поставлю код ниже, чтобы помочь другим людям.
//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
}
cv::namedWindow
в основном потоке, и пусть потоки используют толькоcv::imshow
для своих (ранее созданных) windownames.