繁体   English   中英

QEventLoop 没有同步等待 QNetworkReply 完成

[英]QEventLoop not waiting synchronously for QNetworkReply to finish

我正在使用调用服务器的 Qt 构建一个库,我需要构建一个同步 function 来等待 HTTP 响应(QNetworkReply 对象),我正在使用 QNetworkReply 对象。 当前服务器被调用,但循环不等待回复完成,而是继续使用空的 QNetworkReply object。

完全相同的 function 在我构建的一个简单测试项目中工作,该项目仅包含一个线程和从 main 到此 function 的调用。 等待回复,一切都按预期工作。 但是在我的包含多个线程的项目中,会发生上述场景并且事件循环不等待回复。 请求被发送到服务器并显示在那里,但响应无法返回到 QNetworkReply object,因为 function 已经执行。

这是我的function的网络部分。 在我的项目中,statusCode 变量始终为 0 并且回复为空,但在简单的测试场景中,它们为 200 和预期的 HTTP 响应。

QNetworkAccessManager* networkManager = new QNetworkAccessManager(this);
QNetworkReply* reply = networkManager->get(request);

QEventLoop loop;
connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
loop.exec();

QVariant statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
qInfo() << "Http Get completed with status code:" << statusCode.toInt();

原因

对不起,我没听你的……

换句话说,您在发出请求连接到finished的信号,因此在发出请求时没有人在监听您的信号。

解决方案

在使用networkManager->get(request)发送请求之前连接到QNetworkAccessManager::finished

例子

请仔细阅读QNetworkAccessManager的详细描述。 有如何正确使用 class 的示例。 例如:

QNetworkAccessManager *manager = new QNetworkAccessManager(this);
connect(manager, &QNetworkAccessManager::finished,
        this, &MyClass::replyFinished);

manager->get(QNetworkRequest(QUrl("http://qt-project.org")));
QNetworkAccessManager *manager = new QNetworkAccessManager(this);
QUrl resource(url);
QNetworkRequest request(resource);
QNetworkReply *reply = manager->get(request);
QEventLoop loop;
connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
loop.exec();
QJsonObject jsonObject = QJsonDocument::fromJson(reply->readAll()).object();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM