使用QEventLoop将异步操作变成同步操作
异步调用举例我们来看一个例子,我们向服务器请求服务器时间,异步的方式,我们的写法是这样的:voidHelper
QT教程 2023-05-13 17:19:30
我们来看一个例子,我们向服务器请求服务器时间,异步的方式,我们的写法是这样的:
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开发教程 学习资料, 点击下方链接莬费领取↓↓ ,先码住不迷路~】
点击这里:
异步调用举例我们来看一个例子,我们向服务器请求服务器时间,异步的方式,我们的写法是这样的:voidHelper
5月12日下午,嘉定区召开深化网格工程建设推进会,对党建引领网格治理工作再部署、再深化,以网格贯通基层
1、在任何地方都有可能爆,只不过是运气和技巧罢了。2、我觉得,打BOSS千万不要把它逼到角落里,在中间靠右
5月20日谐音我爱你不少准新人选择在这天登记结婚讨个好彩头今年5月20日恰逢周六为满足群众的需求江苏一些地
问:击球员在瞄准时,自球突然自行向后滚动,击球员来不及撤棒,自球碰到了球槌击球面,问如何判处?答:规
在国羽正在积极备战即将开打的苏迪曼杯之时,球迷们听到了奥运冠军谌龙退役的消息。5月12日,中国羽毛球队
今日湖勇大战一触即发,首节浓眉表现神勇,4中3独得9分,并摘下10个篮板!管泽元看毕直接盛赞:你也学皮尔
1、罗塔1935年生,蒙古族。2、笔名尼·罗塔。3、新疆博乐人。4、1956年毕业于内蒙古蒙文专科学校,1963
多主体投入多模式组建企业化运行产学研用融合湖北新型研发机构达452家居全国前列---新型研发机构是加强科技
河南柘城三樱椒,果实才有二寸长,小拇指粗细,却是椒小味辣、营养丰富,行销海内外。从种植三樱椒开始,柘
沧源县气象台2023年5月13日07时10分发布暴雨黄色预警信号:过去3小时,我县勐来乡英格村降雨量达37 2毫米、
2022年8月,广西柳州的周女士在某App上发了一条名为“进来聊聊你住过柳州最不满意的月子中心”的话题,话题
1、襦裙可以单襦穿着,也可内辅以诃子、抹胸等;外衣可以选择半臂、褙子、比甲等,裙外可加帏裳;还用加帔
快充、精准续航、电池安全卫士、无感解锁、辅助骑行……在新品中,哈啰图灵T30带来的依旧是更为实用更具时
1、allowdoing sth 允许做某事。2、如:Wedon’talloweatinginthec