qt中将一个类的函数放到线程中执行

效果图
qt中将一个类的函数放到线程中执行_第1张图片

  1. 在.pro中添加
    QT += concurrent testlib

  2. 创建测试类如下

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<<"-";
    }
    }
};
  1. 实例化测试类,并将其中的函数放入到线程中执行
    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 

#include 
#include 
#include 
#include 
#include 

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"

你可能感兴趣的:(网络线程进程,QtConcurrent,QThread)