停止线程由QtConcurrent :: run启动?

时间:2013-09-17 09:03:59

标签: multithreading qt qtconcurrent

是否可以通过其关联的QFuture对象停止线程? 目前我一直在开始这样的视频捕捉过程。

this->cameraThreadRepresentation = QtConcurrent::run(this,&MainWindow::startLiveCapturing);

在startLiveCapturing-Method内部运行一个无限循环,捕获图像并显示它们。因此,如果用户想要停止该过程,则只需按下按钮即可停止该操作。 但似乎我不能通过调用这样的取消方法来阻止这个线程吗?

this->cameraThreadRepresentation.cancel();

我做错了什么以及如何停止该线程或操作。

2 个答案:

答案 0 :(得分:6)

来自QtConcurrent::run的文档:

  

请注意,QtConcurrent :: run()返回的QFuture不支持取消,暂停或继续报告。返回的QFuture只能用于查询运行/完成状态和函数的返回值。

你可以做的是按下按钮在你的主窗口中设置一个布尔标志并构建你的无限循环:

_aborted = false;

forever    // Qt syntax for "while( 1 )"
{
    if( _aborted ) return;

    // do your actual work here
}

答案 1 :(得分:2)

为什么不创建一个可以在捕获循环中测试的布尔标志,当它被设置时,它跳出来并且线程退出?

类似的东西:

MainWindow::onCancelClick() // a slot
{
    QMutexLocker locker(&cancelMutex);
    stopCapturing = true;
}

然后是你的线程函数:

MainWindow::startLiveCapturing()
{
   forever
   {

       ...
       QMutexLocker locker(&cancelMutex);
       if (stopCapturing) break;
   }

}