gpt4 book ai didi

c++ - QRunnable 并传递一个指针

转载 作者:行者123 更新时间:2023-11-30 03:33:32 25 4
gpt4 key购买 nike

我正在尝试将指针 (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);
}

类,我在其中使用 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;
}
}
}

Pointer 指向 aimMat,它应该由 8 个线程填充。每个线程在不同的图像区域工作。但实际上我只使用了一个线程和一个 AOI。

感谢您的帮助。

最佳答案

你有

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

TestMat 定义为局部变量。当函数返回时,局部变量超出范围。这意味着 TestMat 对象将被破坏,当 MapRealToMat 退出时,它的内存将被回收。

在定义 TestMa 之后,您可以:

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

在这里,您将指向局部变量的指针传递给您的类。阅读上一段后,这个问题应该很明显。在 MapRealToMat 返回后,指针将不再指向有效对象。

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

关于c++ - QRunnable 并传递一个指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42786486/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com