gpt4 book ai didi

c++ - 带有 QConcurrent::run 的 QMutex 没有按预期工作?

转载 作者:行者123 更新时间:2023-11-28 05:50:35 25 4
gpt4 key购买 nike

我正在制作一个 Qt GUI 应用程序,它使用自定义 QLabel 类(名称为 ImageInteraction)来显示来自流式摄像机的图像,同时还允许在图像上进行鼠标交互.由于 GUI 具有其他功能,自定义的 QLabel 类完成了从相机中提取图像并通过在另一个线程中运行的函数中的 while 循环更新其显示图像的工作。代码如下:

void ImageInteraction::startVideo()
{
if (!capture.open(streamUrl))
{
QMessageBox::warning(this, "Error", "No input device availabe!");
}
else
{
QFuture<void> multiprocess = QtConcurrent::run(this, &ImageInteraction::loadVideo);
}
}

void ImageInteraction::loadVideo()
{
while(loopContinue){
cv::Mat frame;
capture.read(frame);
if(!frame.empty())
{
cv::cvtColor(frame, frame, CV_BGR2RGBA);
cv::resize(frame, frame, cv::Size(this->width(), this->height()), 0, 0);
QImage image(frame.data, frame.cols, frame.rows, frame.step, QImage::Format_RGBA8888);
this->setPixmap(QPixmap::fromImage(image));
}
}
capture.release();
}

这里的 capturecv::VideoCapture 类型,loopContinue 是 bool 类型,初始设置为 true。有一个 closeEvent() 函数调用停止从相机捕获图像的方法。

void MainWindow::closeEvent(QCloseEvent *event)
{
liveVideo->stopVideoThread();//liveVideo is a pointer to an object of ImageInteraction
event->accept();
}

其中 stopVideoThread 只是将 bool 标志 loopContinue 设置为 false 并具有以下简单代码:

void ImageInteraction::stopVideoThread()
{
mutex.lock();//QMutex mutex;
loopContinue = false;
mutex.unlock();
}

根据我的理解,loadVideo 方法中的 while 循环应该在调用 stopVideoThread 方法后停止,并且 loopContinue设置为假。但实际上,当按下关闭按钮时,显然它不会停止 while 循环并且应用程序崩溃并显示一条消息:

The inferior stopped because it received a signal from the operating system.

Signal name : SIGSEGV
Signal meaning : Segmentation fault

我是否错误地使用了 QtConcurrent::run 方法和 QMutex 对象?你能确定是什么问题吗?仅供引用,操作系统是 ubuntu 14.04,IDE 是 QtCreator。

谢谢!

最佳答案

以下只是上述评论中提到的改进的一个想法。

class ImageInteraction
{
public:
~ImageInteraction()
{
multiprocess_.waitForFinished();
}

void startVideo()
{
if (!capture.open(streamUrl))
{
QMessageBox::warning(this, "Error", "No input device availabe!");
}
else
{
multiprocess_ = QtConcurrent::run(this, &ImageInteraction::loadVideo);
}
}

void loadVideo()
{
while(loopContinue_)
{
cv::Mat frame;
capture.read(frame);
if(!frame.empty())
{
cv::cvtColor(frame, frame, CV_BGR2RGBA);
cv::resize(frame, frame, cv::Size(this->width(), this->height()), 0, 0);
QImage image(frame.data, frame.cols, frame.rows, frame.step, QImage::Format_RGBA8888);
this->setPixmap(QPixmap::fromImage(image));
}
}
capture.release();
}

void stopVideoThread()
{
loopContinue_ = false;
//multiprocess_.waitForFinished(); // you can call this here if you want to make sure that the thread has finished before returning
}

private:
QFuture<void> multiprocess_;
std::atomic<bool> loopContinue_;
};

关于c++ - 带有 QConcurrent::run 的 QMutex 没有按预期工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35343877/

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