几个要点:
通过QtConcurrent::run()返回的QFuture不支持取消、暂停,返回的QFuture只能用于查询函数的运行/完成状态和返回值。
请注意:该函数可能不会立即运行; 函数只有在线程可用时才会运行。
导入模块
在 C++ API changes 有关于 Qt Concurrent 的更改说明
Qt Concurrent has been moved from Qt Core to its own module
大致意思就是,Qt Concurrent已经从 QtCore 中移除并成为了一个独立的模块。
所以在使用的时候需要在工程文件中导入模块,如下
QT += concurrent
Qt之QtConcurrent_不会编程的-程序猿的博客-CSDN博客_qtconcurrent
示例1:将普通函数运行在两个不同的线程中
改文章中的示例文件在QT5.15的例子:
#include <QString>
#include <QDebug>
#include <QThread>
#include <QApplication>
//#include "qtconcurrentrun.h"
#include <QtConcurrent/QtConcurrent>
QString func1()
{
qDebug()<<"我是func1函数";
qDebug() << "from" << QThread::currentThread();
}
QString func2(QString name)
{
qDebug()<<"我是func2函数";
qDebug() << name << "from" << QThread::currentThread();
}
int main(int argc, char **argv)
{
QApplication app(argc, argv);
QFuture<QString> fut1 = QtConcurrent::run(func1);// 1.用QFuture获取该函数的运行结果
QFuture<QString> fut2 = QtConcurrent::run(func2, QString("Thread 1"));//2.参数2:向func函数传递的参数
QString result1 = fut1.result();
QString result2 = fut2.result();
qDebug() <<"waitForFinished before";
qDebug() <<"result1:" << result1;
qDebug() <<"result2:" << result2;
fut1.waitForFinished();
fut2.waitForFinished();
qDebug() <<" after waitForFinished";
qDebug() <<"result1:" << result1;
qDebug() <<"result2:" << result2;
}
pro文件需要添加一句:
QT += widgets
执行结果如下:
由于两个函数非void函数,但是返回QString在各个方法里面并未出现所以会出现崩溃。
调试情况下会出现错误Segmentation fault:
将代码修正为:
#include <QString>
#include <QDebug>
#include <QThread>
#include <QApplication>
//#include "qtconcurrentrun.h"
#include <QtConcurrent/QtConcurrent>
QString func1()
{
qDebug()<<"我是func1函数";
qDebug() << "from" << QThread::currentThread();
return "func1";
}
QString func2(QString name)
{
qDebug()<<"我是func2函数";
qDebug() << name << "from" << QThread::currentThread();
return "func2";
}
int main(int argc, char **argv)
{
QApplication app(argc, argv);
QFuture<QString> fut1 = QtConcurrent::run(func1);// 1.用QFuture获取该函数的运行结果
QFuture<QString> fut2 = QtConcurrent::run(func2, QString("Thread 1"));//2.参数2:向func函数传递的参数
QString result1 = fut1.result();
QString result2 = fut2.result();
qDebug() <<"waitForFinished before";
qDebug() <<"result1:" << result1;
qDebug() <<"result2:" << result2;
fut1.waitForFinished();
fut2.waitForFinished();
qDebug() <<" after waitForFinished";
qDebug() <<"result1:" << result1;
qDebug() <<"result2:" << result2;
}
则输出结果为:
不在出现crashed