源自工作中的一段代码逻辑,将其进行简化,只保留希望学习了解的部分
简单说,一个 QFuture 任务,执行完成后,考虑以下两个问题
isFinished
和isResultReadyAt
有什么区别
将任务清空后,
isFinished
和isResultReadyAt
是否依然有效
好了,直接看示例代码,首先不清空运行结果
#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
无输出
总结:
- 不管是否清空 QFuture,运行结束后 isFinished 总是成功的
- 如果任务被清空,isResultReadyAt 不会有结果,否则依然会有结果