1
我有一個主要功能從某處拍攝圖像,並且應該在新線程中顯示圖像。這是我在做什麼:OpenCV,pthread - 在新線程中顯示圖像
int main(int argc, char** argv)
{
Mat frame = imread("img.jpg");
auto_ptr<SomeClass> thread1(new SomeClass(1, frame));
auto_ptr<SomeClass> thread2(new SomeClass(2, frame));
thread1->Start();
thread2->Start();
int result1 = reinterpret_cast<int>(thread1->Join());
int result2 = reinterpret_cast<int>(thread2->Join());
return 0;
}
我發現有很多的源代碼來實現一個簡單的並行線程包裝類,哪些是行之有效的,只要我不嘗試通過「CV :: Mat框架「圖像到派生線程(通過它的構造函數)。
的並行線程包裝類:
/* ********************* THREAD.H ********************* */
extern "C++" class __declspec(dllexport) Thread
{
public:
Thread();
virtual ~Thread(void);
void Start(void);
void* Join(void);
private:
virtual void* Run(void) = 0;
static void* StartThread(void* pVoid);
pthread_t threadID_;
pthread_attr_t threadAttribute_;
void* result_;
};
/* ********************* THREAD.CPP ********************* */
Thread::Thread() {}
Thread::~Thread() {}
void* Thread::StartThread(void* pVoid)
{
Thread* aThread = static_cast<Thread*>(pVoid);
aThread->result_ = aThread->Run();
return aThread->result_;
}
void Thread::Start()
{
pthread_attr_init(&threadAttribute_);
pthread_attr_setscope(&threadAttribute_, PTHREAD_SCOPE_SYSTEM);
pthread_create(&threadID_, &threadAttribute_, Thread::StartThread, (void*)this);
pthread_attr_destroy(&threadAttribute_);
}
void* Thread::Join()
{
pthread_join(threadID_, NULL);
return result_;
}
線程的子類可以看起來象下面這樣:
/* ********************* SOMECLASS.H ********************* */
extern "C++" class __declspec(dllexport) SomeClass : public Thread
{
public:
SomeClass(int id, cv::Mat& frame);
~SomeClass(void);
virtual void* Run();
private:
int id_;
cv::Mat frame_;
};
/* ********************* SOMECLASS.CPP ********************* */
SomeClass::SomeClass(int id, cv::Mat& frame) : id_(id)
{
frame_ = frame.clone();
}
SomeClass::~SomeClass(void) {}
void* SomeClass::Run()
{
cout << id_ << ", " << frame_.cols << ", " << frame_.rows << endl;
imshow("frame " + id_, frame_);
waitKey(1);
return reinterpret_cast<void*>(id_);
}
執行處斷裂線imshow()...任何想法,這是什麼原因問題或我該如何解決?
你有一個支持C++ 11的編譯器,還是可以訪問boost :: thread? – juanchopanza 2012-04-21 15:03:11
它如何中斷?如果你在一個線程中執行它,它會工作嗎? – 2012-04-21 15:08:45
我使用VS2010,哪一個不支持c + + 11,我不喜歡使用boost。 (編輯: 編輯: 它與「訪問衝突」剎車。它也可以在單線程中工作。 – Kornel 2012-04-21 15:19:05