效果图
-
在.pro中添加
QT += concurrent testlib -
创建测试类如下
struct MyDataInfo{
int a1;
int a2;
int a3;
int a4;
};
class MyConcurentTest{
public:
MyConcurentTest(){}
~MyConcurentTest(){}
void fun1(QString str){
for(int i=0;i<10;i++){
qDebug() << "hello " << str;
}
}
bool fun2(){
for(int i=0;i<10;i++){
qDebug() << "hello fun2";
}
return true;
}
//参数超过5个通过结构体传参
void fun3(QString str,MyDataInfo& datainfo){
for(int i=0;i<10;i++){
qDebug() << "hello," << str<<".."<<datainfo.a1<<"-"<<datainfo.a2
<<"-"<<datainfo.a3<<"-"<<datainfo.a4<<"-";
}
}
};
- 实例化测试类,并将其中的函数放入到线程中执行
MyConcurentTest mc;
//QFuture后的<>内写入函数返回的类型
//无参数返回,传递参数
QString str = "gg";
QFuture<void> res = QtConcurrent::run(&mc, &MyConcurentTest::fun1,str);
//有参数返回,无参数传递
QFuture<bool> res1 = QtConcurrent::run(&mc, &MyConcurentTest::fun2);
for(int i=0;i<10;i++){
qDebug() << "hello main";
}
//获取线程中执行函数返回的结果
bool testres = res1.result();
qDebug() << "res1:" << testres ;
//超过5个参数的调用
MyDataInfo datainfo;
datainfo.a1 = 1;
datainfo.a2 = 2;
datainfo.a3 = 3;
datainfo.a4 = 4;
QFuture<void> res3 = QtConcurrent::run(&mc, &MyConcurentTest::fun3,str,datainfo);
if(!res.isFinished()){判断线程是否执行完成
res.waitForFinished();//等待线程执行完
}
qDebug() << "res:" << res.isFinished();//true
在类的一个方法中调用另一个方法,并将另一个方法放入线程中执行
#include <QApplication>
#include <QObject>
#include <QDebug>
#include <QtConcurrent>
#include <QFuture>
#include <QTest>
class threadLearn : public QObject
{
Q_OBJECT
public:
explicit threadLearn(QObject *parent = nullptr): QObject(parent){
}
void func1(){
QFuture<void> res = QtConcurrent::run(this, &threadLearn::funcThread);
for(int i=0;i<10;i++){
QTest::qSleep(50);//单位ms
qDebug() << "i am in func1 -- " << i;
}
/** 等待线程执行完成
qDebug() << "wait funcThread";
if(!res.isFinished()){
res.waitForFinished();//等待线程执行完
}
qDebug() << "res:" << res.isFinished();*/
}
void funcThread(){
for(int i=0;i<5;i++){
QTest::qSleep(200);//单位ms
qDebug() << "in funcThread -- " << i;
}
}
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
threadLearn tl;
tl.func1();
qDebug() << "func1 finish!";
return 0;
return a.exec();
}
#include "main.moc"