我试图将指针(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。
感谢您的帮助。
答案 0 :(得分:2)
你有
cv::Mat TestMat = cv::Mat::ones(424, 512, CV_32FC1);
将TestMat
定义为局部变量。函数返回时,局部变量超出范围。这意味着TestMat
对象将被销毁,并且在MapRealToMat
退出时将回收其内存。
完成TestMa
的定义之后:
ThreadClass *Part1 = new ThreadClass(PointVec,&TestMat);
在这里,您将指向本地变量的指针传递给您的类。阅读上一段后,这个问题应该是显而易见的。返回MapRealToMat
后,指针将不再指向有效对象。
简单的解决方案可能是通过值传递TestMat
对象而不是使用指针。