Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 停止由QtConcurrent::run启动的线程?_Multithreading_Qt_Qtconcurrent - Fatal编程技术网

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

Multithreading 停止由QtConcurrent::run启动的线程?,multithreading,qt,qtconcurrent,Multithreading,Qt,Qtconcurrent,是否可以通过关联的QFuture对象停止线程? 目前,我已经开始了这样的视频捕获过程 this->cameraThreadRepresentation = QtConcurrent::run(this,&MainWindow::startLiveCapturing); 在StartiveCapturing方法中,一个无限循环正在运行,它捕获并显示图像。因此,如果用户想要停止这个过程,他只需按下一个按钮,操作就会停止。 但是,我似乎不能通过像这样调用cancel方法来停止这个线程

是否可以通过关联的QFuture对象停止线程? 目前,我已经开始了这样的视频捕获过程

this->cameraThreadRepresentation = QtConcurrent::run(this,&MainWindow::startLiveCapturing);
在StartiveCapturing方法中,一个无限循环正在运行,它捕获并显示图像。因此,如果用户想要停止这个过程,他只需按下一个按钮,操作就会停止。 但是,我似乎不能通过像这样调用cancel方法来停止这个线程

this->cameraThreadRepresentation.cancel();
我做错了什么以及如何停止该线程或操作。

来自以下文档:

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

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

_aborted = false;

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

    // do your actual work here
}

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

比如:

MainWindow::onCancelClick() // a slot
{
    QMutexLocker locker(&cancelMutex);
    stopCapturing = true;
}
然后对于线程函数:

MainWindow::startLiveCapturing()
{
   forever
   {

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

}

这是最简单的“一次性”解决方案。其他建议请参见的答案。事实上,这是一个非常糟糕的解决方案,没有考虑到。。。什么都行。这里有相互排斥的龙。相反,几乎可以肯定的是,每个人都想模仿意大利面。大约只有四十行代码。它实际上也可以按预期工作,允许暂停、恢复、停止和重新启动任意多线程任务。否则,优化器可能会删除对bool的检查,并导致不同编译器上的不同行为: