QFuture结果等待与处理的细节

源自工作中的一段代码逻辑,将其进行简化,只保留希望学习了解的部分

简单说,一个 QFuture 任务,执行完成后,考虑以下两个问题

isFinishedisResultReadyAt 有什么区别

将任务清空后,isFinishedisResultReadyAt 是否依然有效

好了,直接看示例代码,首先不清空运行结果

#include <QCoreApplication>
#include <QFuture>
#include <QDebug>
#include <QThread>
#include <QtConcurrent/QtConcurrent>

int main(int argc, char *argv[])
{
    QFuture<int> future = QtConcurrent::run([](){
        for (int i = 0; i < 3; ++i) {
            QThread::msleep(500);
            // 模拟产生多个结果
            qDebug() << "count:" << i + 1;
        }
        return 0;
    });

    future.waitForFinished();
    if(future.isFinished()){
        qDebug() << "task is over";
    }
    
    // future = QFuture<int>();
    if(future.isFinished()){
        qDebug() << "task is over";
    }
    if(future.isResultReadyAt(0)){
        qDebug() << "task is over";
    }

    return 0;
}

运行输出

10:25:07: Starting D:\Code\build-futureResultTest-Desktop_Qt_5_12_8_MSVC2017_64bit-Release\futureResultTest.exe ...
count: 1
count: 2
count: 3
task is over
task is over
task is over
QWaitCondition: Destroyed while threads are still waiting

可以看到,不清除 future 任务,task is over输出了3遍,最后两次的判断都生效了

清空运行结果

#include <QCoreApplication>
#include <QFuture>
#include <QDebug>
#include <QThread>
#include <QtConcurrent/QtConcurrent>

int main(int argc, char *argv[])
{
    QFuture<int> future = QtConcurrent::run([](){
        for (int i = 0; i < 3; ++i) {
            QThread::msleep(500);
            // 模拟产生多个结果
            qDebug() << "count:" << i + 1;
        }
        return 0;
    });

    future.waitForFinished();
    if(future.isFinished()){
        qDebug() << "task is over";
    }
    
    future = QFuture<int>();
    if(future.isFinished()){
        qDebug() << "task is over";
    }
    if(future.isResultReadyAt(0)){
        qDebug() << "task is over";
    }

    return 0;
}

运行输出

10:26:13: Starting D:\Code\build-futureResultTest-Desktop_Qt_5_12_8_MSVC2017_64bit-Release\futureResultTest.exe ...
count: 1
count: 2
count: 3
task is over
task is over
QWaitCondition: Destroyed while threads are still waiting

清除 future 任务后,第二次判断 isFinished 依然有输出,但 isResultReadyAt 无输出

总结:

  1. 不管是否清空 QFuture,运行结束后 isFinished 总是成功的
  2. 如果任务被清空,isResultReadyAt 不会有结果,否则依然会有结果
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Prejudices

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值