Qt QEventLoop未同步等待QNetworkReply完成
我正在用Qt构建一个调用服务器的库,我需要构建一个等待HTTP响应的同步函数(QNetworkReply对象),我正在使用QEventLoop来实现这一点。当前服务器被调用,但循环不会等待应答完成,而是使用空的QNetworkReply对象继续 完全相同的函数在我构建的一个简单测试项目中工作,该项目只包含一个线程和一个从main到该函数的调用。等待答复,一切都按预期进行。但在我的包含多个线程的项目中,会出现上述场景,事件循环不会等待回复。请求被发送到服务器并显示在那里,但是响应无法返回到QNetworkReply对象,因为函数已经执行 这是我函数的网络部分。在我的项目中,statusCode变量总是以0结束,回复为空,但在简单测试场景中,它们是200,并且是预期的HTTP响应Qt QEventLoop未同步等待QNetworkReply完成,qt,qnetworkreply,qeventloop,Qt,Qnetworkreply,Qeventloop,我正在用Qt构建一个调用服务器的库,我需要构建一个等待HTTP响应的同步函数(QNetworkReply对象),我正在使用QEventLoop来实现这一点。当前服务器被调用,但循环不会等待应答完成,而是使用空的QNetworkReply对象继续 完全相同的函数在我构建的一个简单测试项目中工作,该项目只包含一个线程和一个从main到该函数的调用。等待答复,一切都按预期进行。但在我的包含多个线程的项目中,会出现上述场景,事件循环不会等待回复。请求被发送到服务器并显示在那里,但是响应无法返回到QNet
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();
QNetworkAccessManager*networkManager=新的QNetworkAccessManager(此);
QNetworkReply*reply=networkManager->get(请求);
QEventLoop循环;
连接(应答、信号(finished())、循环和插槽(quit());
loop.exec();
QVariant statusCode=回复->属性(QNetworkRequest::HttpStatusCodeAttribute);
原因
对不起,我没听你说
换句话说,您在发出请求后连接到finished
信号,因此在发出请求时没有人在听您的信号
解决方案
在使用networkManager->get(请求)
发送请求之前连接到
例子
请仔细阅读本手册的详细说明。这里有一些关于如何正确使用该类的示例。例如:
QNetworkAccessManager *manager = new QNetworkAccessManager(this);
connect(manager, &QNetworkAccessManager::finished,
this, &MyClass::replyFinished);
manager->get(QNetworkRequest(QUrl("http://qt-project.org")));
您声明,“…在我构建的一个只包含一个线程的简单测试项目中工作”
。如果正在使用多个线程,那么您需要提供更多关于如何创建/管理这些线程的上下文——最好是一个上下文。