Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt QEventLoop未同步等待QNetworkReply完成_Qt_Qnetworkreply_Qeventloop - Fatal编程技术网

Qt QEventLoop未同步等待QNetworkReply完成

Qt QEventLoop未同步等待QNetworkReply完成,qt,qnetworkreply,qeventloop,Qt,Qnetworkreply,Qeventloop,我正在用Qt构建一个调用服务器的库,我需要构建一个等待HTTP响应的同步函数(QNetworkReply对象),我正在使用QEventLoop来实现这一点。当前服务器被调用,但循环不会等待应答完成,而是使用空的QNetworkReply对象继续 完全相同的函数在我构建的一个简单测试项目中工作,该项目只包含一个线程和一个从main到该函数的调用。等待答复,一切都按预期进行。但在我的包含多个线程的项目中,会出现上述场景,事件循环不会等待回复。请求被发送到服务器并显示在那里,但是响应无法返回到QNet

我正在用Qt构建一个调用服务器的库,我需要构建一个等待HTTP响应的同步函数(QNetworkReply对象),我正在使用QEventLoop来实现这一点。当前服务器被调用,但循环不会等待应答完成,而是使用空的QNetworkReply对象继续

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

这是我函数的网络部分。在我的项目中,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();
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")));
您声明,
“…在我构建的一个只包含一个线程的简单测试项目中工作”
。如果正在使用多个线程,那么您需要提供更多关于如何创建/管理这些线程的上下文——最好是一个上下文。