0
点赞
收藏
分享

微信扫一扫

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

小美人鱼失去的腿 2022-02-23 阅读 110

方法一:使用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

对于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();
}

运行结果:
在这里插入图片描述

举报

相关推荐

0 条评论