6

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

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

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

this->cameraThreadRepresentation.cancel();

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

4

3 回答 3

8

QtConcurrent::run的文档中:

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

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

_aborted = false;

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

    // do your actual work here
}
于 2013-09-17T09:13:48.817 回答
2

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

就像是:

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

然后对于您的线程函数:

MainWindow::startLiveCapturing()
{
   forever
   {

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

}
于 2013-09-17T09:18:24.223 回答
0

正如 Qt Document 所说,您不能使用cancel()功能 firQConcurrent::run()但您可以通过以下答案取消任务:

https://stackoverflow.com/a/16729619/14906306

于 2021-09-20T11:53:56.157 回答