全球观热点:使用QEventLoop将异步操作变成同步操作

2023-05-13 17:47:41 来源:QT教程

异步调用举例

我们来看一个例子,我们向服务器请求服务器时间,异步的方式,我们的写法是这样的:

void Helper::getServerTimeAsync(){auto networkManager = new QNetworkAccessManager;connect(networkManager, &QNetworkAccessManager::finished, [=](QNetworkReply* reply) {networkManager->deleteLater();emit serverTime(reply->rawHeader("time").toLongLong());});networkManager->get(QNetworkRequest(QUrl("https://10.10.10.1/time")));}

在上述代码中,我们通过连接QNetworkAccessManager::finished信号来在未来某个时候发出finished信号时处理回复数据,然后将得到的时间以信号的方式发出去。


【资料图】

调用者在使用这个接口时,那就是下面这样:

auto helper = new Helper;connent(helper, &Helper::serverTime, [](time_t time) {qDebug() << time;});helper.getServerTimeAsync();

相当于调用getServerTimeAsync只是发一个获取时间的请求,这个时候并不能立即得到时间,必须在未来某个时候Helper::serverTime信号触发时才能得到时间。

改成同步调用

现在,我们通过QEventLoop来改成同步调用:

time_t Helper::getServerTimeSync(){QNetworkAccessManager networkManager;QEventLoop eventLoop;QTimer timer;connect(&timer, &QTimer::timeout, [&eventLoop] { eventLoop.quit(); });connect(&networkManager, &QNetworkAccessManager::finished, [&eventLoop](QNetworkReply* reply) {eventLoop.quit();});auto reply = networkManager.get(QNetworkRequest(QUrl("https://10.10.10.1/time")));timer.start(3000);eventLoop.exec();reply->deleteLater();if (reply->error() != QNetworkReply::NoError)return 0;return reply->rawHeader("time").toLongLong();}

如上代码,创建定时器用于超时处理,超时时直接退出事件循环;QNetworkAccessManager::finished触发时也退出事件循环;最后使用QEventLoop来开启事件循环阻塞当前函数(由于是阻塞调用,那networkManager不需要new,直接局部变量即可);当超时时间到或者finished信号触发时事件循环退出,我们再去从reply里解析时间,最后返回。

可能看上面代码,实现变复杂了好多,但是接口使用起来就简单很多:

qDebug() << helper.getServerTimeSync();

1.

总结

很多异步的操作,比如上面的QNetworkAccessManager的post、get,或者使用QProcess创建子进程处理任务的情况,都可以改成同步调用,但是要注意的时,改成同步调用后,在调用返回之前,函数是被阻塞掉的,修改之前就要考虑阻塞的话会不会影响业务逻辑。

【领 QT开发教程 学习资料, 点击下方链接莬费领取↓↓ ,先码住不迷路~】

点击这里:

标签:

全球观热点:使用QEventLoop将异步操作变成同步操作

异步调用举例我们来看一个例子,我们向服务器请求服务器时间,异步的方式,我们的写法是这样的:voidHelper

2023-05-13 17:47:41

环球快报:PTT网友讨论欧美为啥FPS猛LOL拉:美国人现实也能玩枪战 练习充足

MSI胜败分组赛已经结束,欧美赛区四支队伍全部跌入败者组,而中韩四支队伍都晋级胜者组。赛后隔壁PTT论坛网

2023-05-13 16:13:29

【环球热闻】熙菱信息:5月12日召开业绩说明会,投资者参与

2023年5月12日熙菱信息(300588)发布公告称公司于2023年5月12日召开业绩说明会。

2023-05-13 15:17:43

十二生肖运势今日运势查询运,今日特吉生肖有哪些 关注

十二生肖运势今日运势查询运鼠:事业运势:工作运很好,今天在工作中严肃认真,做事稳重,可以让老板看到你

2023-05-13 14:33:28

当前热讯:初夏暖阳耕种忙 新疆阿克苏花生播种正当时

眼下正是花生播种的好时节,连日来,新疆阿克苏种植户们抢抓气温回升、土壤墒情适宜的有利时机,充分发挥农

2023-05-13 13:04:24

长生不老是不是一件好事正方(长生不老是不是一件好事)

1、不说是不是好事,,根本就没有长生不老的人。2、追求长生不老的人,反而死得更快,,秦始皇,就是最典型

2023-05-13 12:11:38

全球今日讯!死神vs火影斑的隐藏大招_死神vs火影斑隐藏技能

1、打开百度,搜索点击死亡vs霍颖,在4399首页找到你想玩的版本,然后点击游戏。2、在游戏首页下拉,然后点

2023-05-13 11:46:52

江铃易至EV3小雷达,快充0.5小时,纯电续航302km 世界热点

在这篇测评文章中,我们将为大家介绍江铃易至EV3小雷达(图片|配置|询价)2022款悦跑型。易至EV3小雷达最低售

2023-05-13 10:42:35

陆家嘴外企高管共话:我们为何要在中国加大创新和研发的投入|世界热文

5月12日,在“高质量发展调研行”上海陆家嘴金融城情况介绍会上,多家外企在交流中表达了在陆家嘴发展的...

2023-05-13 09:56:02

三国杀于禁该如何玩_三国杀于禁 全球球精选

今天小编肥嘟来为大家解答以上的问题。三国杀于禁该如何玩,三国杀于禁相信很多小伙伴还不知道,现在让我们

2023-05-13 09:04:19
x 广告
x 广告

Copyright ©  2015-2022 南极经营网版权所有  备案号:粤ICP备2022077823号-13   联系邮箱: 317 493 128@qq.com