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

效果图
在这里插入图片描述

  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 <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"
  • 6
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

努力减肥的小胖子5

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

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

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

打赏作者

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

抵扣说明:

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

余额充值