qt实现异步调用函数的两种方法

⌚Time: 2022-02-23 22:37:18

👨‍💻Author: Jack Ge

同步调用为阻塞式的执行函数,当前函数未执行完毕,程序不会往下运行。对于异步调用的函数,是非阻塞的运行,即使没有执行完毕程序也会往下执行,在qt程序中,若想实现异步调用函数,可以通过以下两种方法实现

方法一:使用c++的std::async()

使用时需要在项目文件中加入c++11支持


QMAKE_CXXFLAGS += -std=c++11

所需头文件


#include<future>

函数原型:


future<typename result_of<Fn(Args...)>::type> async(launch policy, Fn&& fn, Args&&...args);

对于launch policy,可以是:


std::launch::async //异步执行

std::launch::deferred //同步执行

std::launch::async | std::launch::deferred //异步或同步执行,取决于操作系统

fn是调用的函数名,args为函数参数

使用get、wait、wait_for、wait_until方法等待函数执行结束,使用get方法取得函数返回值,若异步函数未结束,使用get方法会阻塞当前线程。

例子:


#include <QCoreApplication>

#include<future>

#include<QThread>

#include<QDebug>

int function(int arg){

    QThread::msleep(1000);

    qDebug()<<"异步函数运行中";

    qDebug()<<"异步函数参数:"<<arg;

    return 10;

}



int main(int argc, char *argv[])

{

    QCoreApplication a(argc, argv);

    std::future<int> fu=std::async(std::launch::async,function,5);

    qDebug()<<"主线程运行中";

    qDebug()<<"异步函数返回值:"<<fu.get();

    return a.exec();

}


运行结果:


方法二:使用QtConcurrent::run函数

所需头文件


#include<QtConcurrent/QtConcurrent>

函数原型:


QFuture<T> QtConcurrent::run(Function function, ...)

function为调用函数名,后面是函数的参数

通过waitForFinished方法等待被调用函数运行结束,result方法获取返回值

例子:


#include <QCoreApplication>

#include<QtConcurrent/QtConcurrent>

#include<QDebug>

#include<QThread>

#include<QFuture>

int function(int arg){

    QThread::msleep(1000);

    qDebug()<<"异步函数运行中";

    qDebug()<<"异步函数参数:"<<arg;

    return 11;

}



int main(int argc, char *argv[])

{

    QCoreApplication a(argc, argv);

    QFuture<int> fu=QtConcurrent::run(function,7);

    qDebug()<<"主线程运行中";

    fu.waitForFinished();

    qDebug()<<"异步函数返回值:"<<fu.result();

    return a.exec();

}


运行结果:

异步调用类A的成员函数


QFuture<int> fu=QtConcurrent::run(this,&A::function,7);