qt - QEventLoop 仅等待本地事件而不是主循环事件
问题描述
我正在尝试执行网络请求并等待响应,然后再继续。虽然使用 QEventLoop 可以等待请求,但问题是如果在程序的其他部分触发了其他信号,它们将首先执行。
这是重现问题的代码示例。您可以看到网络请求(我在这里仅使用http://example.com为例)显然会在第二个singleShot
计时器触发之前发出。
#include <QApplication>
#include <QTimer>
#include <QDebug>
#include <QNetworkAccessManager>
#include <QNetworkReply>
void longFunction()
{
qDebug() << "Starting Long Function";
QEventLoop localEventLoop;
QNetworkAccessManager manager;
QNetworkReply *reply = manager.get(QNetworkRequest(QUrl("http://example.com")));
QObject::connect(reply, &QNetworkReply::finished, &localEventLoop, &QEventLoop::quit);
// I wish to block here
// - do not want to pass this point and run
// other events if fired from the main event loop
localEventLoop.exec();
qDebug() << "Finishing Long Function";
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QTimer::singleShot(0, &longFunction);
QTimer::singleShot(1, []() {
qDebug() << " -- Some other function that was issued after";
qDebug() << " -- 'longFunction' started but before 'longFunction' ended";
});
return a.exec();
}
编辑
添加更多信息。上面的代码显然是对问题的过度简化,因为我不能轻易发布所有代码。基本上发生的事情是在我的项目中的其他地方有代码会发出一个连接到longFunction()
上面的信号。显然,我想在继续之前等待来自 REST 调用的响应,因为响应将在该函数稍后指示元素。问题是在稍后的某个时间点(可能在 REST 调用完成之前),我的代码的其他一些部分可能会触发其他一些信号,我不希望处理这些其他信号。我只想等待处理上的 ONE 连接localEventLoop
。
任何帮助将不胜感激
解决方案
QTimer::singleShot(0, &longFunction);
是一个异步函数。它在void longFunction()
执行 QEventLoop 之前返回。结果是您的第二个QTimer::singleShot(1, []() {
将立即触发。解决方案是将 QEventLoop 移到您的函数之外,之前QTimer::singleShot(1, []() {
推荐阅读
- php - MySQL 按日期排序无法正常工作
- android - AssetManager.openFd(filename) 返回 null
- php - PHP中的搜索和过滤功能不起作用
- c - 试图理解置换生成
- java - 如何在spring boot中存储一个xml节点的多个值?
- winforms - PaintEventArgs.ClipRectangle 在 UserControl 上始终为 (0,0,0,0)
- pycharm - Pycharm for Robot 框架中的自动完成
- delphi - Delphi在日期时间范围内生成随机日期时间值
- r - 为什么我不能使用工作计算机下载 R 包
- php - Additional field on checkout for specific payment gateway in Woocommerce