Qt异步非阻塞转为同步阻塞的方法

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

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

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

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

int timeout = 30 * 1000; //超时时间
QTimer *timer;
QEventLoop *loop;
connect(timer, SIGNAL(timeout()), loop, SLOT(quit()));//异步调用超时退出
connect(this, SIGNAL(signal_login_finished()), loop, SLOT(quit()));//异步调用完成退出
login();//执行异步请求
timer->start(timeout);
loop->exec();
disconnect(timer, SIGNAL(timeout()), loop, SLOT(quit()));
disconnect(this, SIGNAL(signal_finished()), loop, SLOT(quit()));
timer->stop();

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

原创文章,作者:365开发网,如若转载,请注明出处:https://www.365codes.com/542.html