QT技巧 - 异步非阻塞转为同步阻塞的方法

521 阅读2分钟

QT技巧 - 异步非阻塞转为同步阻塞的方法


如需转载请标明出处
QQ技术交流群:129518033

目录

### 文章目录* QT技巧 - 异步非阻塞转为同步阻塞的方法

环境:
QT版本:5.6.2
VS版本:VS2013
系统版本:windows 7 64bit


前言

QT中一般都推荐使用异步的方式,因为信号与槽是QT的核心。但是,有些时候我们需要等待一个返回结果之后,才能执行下一步操作。当然,我们可以在返回的槽函数里面继续进行下一步操作,但是,这样不利于程序的解耦。例如,多个部分的UI绘制,必须按照一定顺序绘制,那么如果在槽函数里面写下一个UI的绘制,这样的方式在我们需要删除其中一个UI绘制时,并不能做到很好的解耦。所以本文介绍一种,将异步非阻塞请求转为同步阻塞请求的方法。

1.异步非阻塞转为同步阻塞的方法

采用超时 + 循环等待的方式,将异步非阻塞转为同步阻塞。

启动一个循环,不断的循环检测是否满足退出条件,当满足退出条件(1.超时 2.异步结果返回),退出循环,继续执行其他操作。

2.代码示例

异步请求函数: void getData();
对应的信号:void getDataSignal(QString data);
对应的槽:void onGetData(QString data);

int timeout = 3 * 1000; //超时时间
QTimer t;
QEventLoop q;
connect(&t, &QTimer::timeout, &q, &QEventLoop::quit);  //异步调用超时退出
connect(this,&Mainwindow::getDataSignal, &q, &QEventLoop::quit);  //异步调用完成退出
//执行异步请求
getData();
t.start(timeout);
q.exec();
disconnect(&t, &QTimer::timeout, &q, &QEventLoop::quit);  
disconnect(this,&Mainwindow::getDataSignal, &q, &QEventLoop::quit);
//下一步操作

3.注意事项

QEventLoop需要依赖QCoreApplication或QApplication,如果没有QCoreApplication或QApplication,需要创建QCoreApplication或QApplication实例。

The QAbstractEventDispatcher class provides an interface to manage Qt's event queue.

An event dispatcher receives events from the window system and other sources. It then sends them to the QCoreApplication or QApplication instance for processing and delivery. QAbstractEventDispatcher provides fine-grained control over event delivery.

Reference:
NULL