2016-02-06 2 views
1

Я пытаюсь использовать pthread в моих OpenCV Проект. Внутри я просто пытаюсь открыть два разных изображения, используя два разных потока. В Windows7 + VS2010 + pthreads-win32 lib программа работает хорошо.Использование pthread в простом проекте C++ OpenCV

Но на моем компьютере Debian jessei (Opencv 2.4.1) тот же код, хотя и компилируется, но его выполнение выходит из строя со следующей ошибкой.

[xcb] Unknown request in queue while dequeuing 
[xcb] Most likely this is a multi-threaded client and XInitThreads has not been called 
[xcb] Aborting, sorry about that. 
pthreadTest: ../../src/xcb_io.c:179: dequeue_pending_request: Assertion `!xcb_xlib_unknown_req_in_deq' failed. 
Aborted 

Интересно, когда создается только один поток [для (I = 0; я < 1; я ++)], он работает нормально, и отображается изображение.

Я уже провел 1.5 дня, пытаясь его решить, но не повезло. Кто-нибудь знает, что я делаю неправильно?

Вот код:

#include "opencv2/imgproc/imgproc.hpp" 
#include "opencv2/highgui/highgui.hpp" 
#include <cstdio> 
#include <iostream> 
#include <pthread.h> 

using namespace cv; 
using namespace std; 

struct thread_data { 
    bool isBig; 
    string fileName; 
}; 


void *processImg(void *args) 
{ 
    struct thread_data *data = (struct thread_data *) args; 
    const char * inputImgWinName = data->isBig ? "Big Img" : "Small Img"; 

    cv::Mat imgInput = imread(data->fileName, 1); 

    cv::namedWindow(inputImgWinName, cv::WINDOW_AUTOSIZE); 
    cv::imshow(inputImgWinName, imgInput); 

    cv::waitKey(); 
    pthread_exit(NULL); 
    //return NULL; 
} 


int main(int argc, char** argv) 
{ 
    struct thread_data data[2]; 

    data[0].isBig = true; 
    data[0].fileName = "img1.png"; 

    data[1].isBig = false; 
    data[1].fileName = "img2.png"; 

    pthread_t threads[2]; 
    pthread_attr_t attr; 
    void *status; 

    // Initialize and set thread joinable 
    pthread_attr_init(&attr); 
    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); 

    // Create Threads 
    int rc; 
    for (int i=0; i<2; i++) { 
     rc = pthread_create(&threads[i], &attr, processImg, (void *)&(data[i])); 
     if (rc) { 
      cout << "Error: Unable to create thread"; 
      return -1; 
     } 
    } 

    // free attribute and wait for the other threads 
    pthread_attr_destroy(&attr); 
    for (int i=0; i<2; i++) { 
     rc = pthread_join(threads[i], &status); 
     if (rc){ 
      cout << "Error:unable to join," << rc << endl; 
      exit(-1); 
     } 
     cout << "Thread: "<< i <<" exiting with status: " << status << endl; 
    } 

    pthread_exit(NULL); 
     return 0; 
} 

PS: Я не могу с помощью C++ 11 thread.h по какой-то причине.

+0

Я не использую C++ 11 ** thread **. Вместо этого я использую ** поток POSIX ** (pthread), который требует ** pthread.h ** – kernelman

+0

namedWindow, waitKey должен выйти из ваших потоков, вы мешаете настольному/gui здесь. – berak

+0

@berak, я просто переместил namedWindow и waitKey в main(), и он сработал !!! Благодаря тонну !! вы спаситель. Не могли бы вы скопировать свой комментарий в качестве ответа, я отметю ему ответ. – kernelman

ответ

2

namedWindow, WaitKey должна выходить из ваших потоков, вы вмешиваясь с настольным/гуйте здесь

0

Я знаю, что это старый вопрос, но я имел удовольствие, решая эту ошибку. Я хотел написать в графический интерфейс из нескольких потоков. Решением является запись в очередь из нескольких потоков, а затем обработка этой очереди из основного потока. Это делает его намного проще.

Конечно, используйте замок, когда вы пишете в очередь и т. Д.

Смежные вопросы