2017-03-14 4 views
1

私はポインタ(ImageInput)をQRunnable :: run()メソッドに渡そうとしています。コンパイラがコンパイルされ、エラーは発生しません。しかし、run()で変数を使用しようとすると、プログラムがクラッシュします。誰かが間違いがどこにあるか知っていますか?ここでQRunnableとポインタを渡す

は最小サンプルです:私はスレッドを作成してい

機能、(実際には1):I'amは、実行を使用して

bool framesource::MapRealToMat (std::vector<cv::Point3f> &PointVec) 
{ 
cv::Mat TestMat = cv::Mat::ones(424, 512, CV_32FC1); 
ThreadClass *Part1 = new ThreadClass(PointVec,&TestMat); 
QThreadPool::globalInstance()->start(Part1); 
} 

クラス、()メソッド:

class ThreadClass : public QRunnable 
{ 

public: 
    ThreadClass(std::vector<cv::Point3f> &PointVecInput, cv::Mat *ImageInput): 
     PointVec (PointVecInput), 
     Image (ImageInput) 
    { 
    } 


private: 
    QMutex  mutex; 
    std::vector<cv::Point3f> PointVec; 
    cv::Mat* Image; 
    void run(); 
}; 

void ThreadClass::run() 
{ 
bool wait = true; 
while(wait) 
{ 
    if(mutex.tryLock()) 
    { 
    //Do something with the image, example: 
      cv::imshow("test",*Image); 
      mutex.unlock(); 
      wait = false; 
    } 
} 
} 

ポインタはaimMatを指し、これは8つのスレッドで満たされる必要があります。また、各スレッドは異なるイメージ領域で動作します。しかし、実際には私は1つのスレッドと1つのAOIしか使用していません。

ありがとうございました。

答えて

2

あなたはローカル変数として定義してTestMat

cv::Mat TestMat = cv::Mat::ones(424, 512, CV_32FC1); 

を持っています。関数が復帰すると、ローカル変数は範囲外になります。つまり、が終了するとTestMatオブジェクトが破棄され、そのメモリが再利用されます。

あなたがTestMaの定義後:ここで

ThreadClass *Part1 = new ThreadClass(PointVec,&TestMat); 

あなたのクラスへのローカル変数へのポインタを渡します。この問題は、前の段落を読んだ後に明らかになるはずです。ポインタは、MapRealToMatの戻りの後、有効オブジェクトを指していません。

単純な解決策は、おそらくTestMatオブジェクトをポインタを使用する代わりに値に渡すことです。

+0

ありがとうございました!あなたが正しい。私は各スレッドを待つ必要があります。私はQThreadPool :: globalInstance() - > waitForDone()を使用しています。 、それは正常に動作します。 –

関連する問題