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