使用QEventLoop将异步操作变成同步操作
异步调用举例
我们来看一个例子,我们向服务器请求服务器时间,异步的方式,我们的写法是这样的:
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将异步操作变成同步操作
- 推出小微网格星级创建,嘉定区探索党建引领网格治理新路径
- 地藏戒指_地藏戒
- 官宣了!下周六,这些人不放假!
- 门球裁判案例及问答(十五)
- 天天亮点!国羽主教练夏煊泽确认:34岁的奥运冠军谌龙已经退役
- 解说管泽元怒赞浓眉单节爆砍10板:你也学皮尔斯坐轮椅充电?
- 罗塔_关于罗塔介绍
- 多主体投入 多模式组建 企业化运行 产学研用融合 湖北新型研发机构达452家居全国前列
- 当前速递!二寸辣椒,拉长产业链条
- 沧源佤族自治县气象台发布暴雨预警信号黄色预警【Ⅲ级/较重】【2023-05-13】|每日观察
- 天天观热点:女子被月子中心索赔13.8万元
- 世界要闻:汉服襦裙怎么穿_襦裙怎么穿
- “新一代、新选择” 哈啰智能电动车“极智系列”引领行业新叙事 聚焦
- 今日快看!allow sb to do和allow doing
- 学生探索书系:你不可不知的动物世界百科
- 辽宁省葫芦岛市2023-05-12 19:58发布雷电黄色预警
- 宿州治男科哪医院好
- 当前资讯!每天读点中国文化:饮食天下_关于每天读点中国文化:饮食天下简述
- ROG Ally掌机正式发布,支持显卡拓展坞,国行版6月14日开卖 全球要闻
- 2023第三届长沙国际工程机械展览会有什么好玩的?
- 全球快资讯丨美联储理事沃勒:不认为气候变化的风险甚于银行破产
- 今日看点:广州浪奇:筹划与控股股东进行重大资产置换
- 龙虎榜丨浙数文化今日跌停 3家机构净卖出6069.29万元