QRunnable并通过指针

时间:2017-03-14 12:48:54

标签: c++ multithreading qt

我试图将指针(ImageInput)传递给QRunnable :: run()方法。编译器编译,我没有错误。但是当我尝试在run()中使用该变量时,程序崩溃了。有人知道错误在哪里吗?

以下是最低样本:

功能,我创建线程(实际上只有一个):

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,我正在使用run()方法:

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个线程填充。每个线程在不同的图像区域中工作。但实际上我只使用一个线程和一个AOI。

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

你有

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

TestMat定义为局部变量。函数返回时,局部变量超出范围。这意味着TestMat对象将被销毁,并且在MapRealToMat退出时将回收其内存。

完成TestMa的定义之后:

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

在这里,您将指向本地变量的指针传递给您的类。阅读上一段后,这个问题应该是显而易见的。返回MapRealToMat后,指针将不再指向有效对象。

简单的解决方案可能是通过值传递TestMat对象而不是使用指针。