我有疑问应该如何使用QEventLoop
。我有两段代码,它们都适合我(下载网络资源)。
第一:
QNetworkAccessManager *manager = new QNetworkAccessManager( this );
QNetworkRequest request;
request.setUrl(QUrl(url));
request.setRawHeader("User-Agent", "Mozilla Firefox");
connect(manager, SIGNAL(finished(QNetworkReply*)),this,SLOT(replyFinished(QNetworkReply*)));
manager->get( request ) ;
QEventLoop loop;
connect(manager, SIGNAL(finished(QNetworkReply*)),&loop, SLOT(quit()));
loop.exec();
第二个:
QNetworkAccessManager *manager = new QNetworkAccessManager( this );
QNetworkRequest request;
request.setUrl(QUrl(url));
request.setRawHeader("User-Agent", "Mozilla Firefox");
manager->get( request ) ;
QEventLoop loop;
connect(manager, SIGNAL(finished(QNetworkReply*)),this, SLOT(replyFinished(QNetworkReply*)));
loop.exec();
我想知道的是我应该使用哪一个。我的意思是,信号发出后,事件循环是否会在第二个事件循环中退出?或者我必须打电话quit()
就像第一个一样?我在某处找到了第二个解决方案,但它对我来说似乎不合适,所以我将其修改为第一段代码。
我同意@Mher-Didaryan - 事件循环是通过以下代码行开始的loop.exec();
在第二个代码片段中 - 永远不会退出。这是因为 SIGNAL 和 SLOT 之间的 connect() 是针对不同的事件循环完成的,而不是通过EventLoop loop;
.
对于第一个代码片段,逻辑取决于finished(QNetworkReply*)
与一个且相同的 GET 请求关联的信号被发送到两个不同的事件循环。但很有可能
connect(manager, SIGNAL(finished(QNetworkReply*)),&loop, SLOT(quit()));
可能会在之后执行manager->get( request ) ;
已发出finished(QNetworkReply*)
信号。对于涉及非常小的文件或响应的 GET 类型 HTTP 操作,可能会发生这种情况。在这种情况下,事件循环由loop.exec();
第一个代码片段中的也不会退出。我想这就是@Mher-Didaryan 在他的回答中也在询问的内容。
也许您可以使用下面的 QEventLoop 逻辑来处理以下负面执行场景
- GET 请求超时(例如由于网络连接问题)
-
来自网络服务器端的错误类型响应
QNetworkAccessManager *manager = new QNetworkAccessManager(this);
QNetworkRequest request;
QEventLoop loop;
QTimer getTimer; // let's use a 10 second period for timing out the GET opn
request.setUrl(QUrl(url));
request.setRawHeader("User-Agent", "Mozilla Firefox");
// connect the timeout() signal of getTimer object to quit() slot of event loop
QTimer::connect(&getTimer,SIGNAL(timeout()),&loop, SLOT(quit()));
QObject::connect(manager, SIGNAL(finished(QNetworkReply*)),&loop, SLOT(quit()));
QNetworkReply *resp = manager->get( request );
getTimer.start(10000); // 10000 milliSeconds wait period for get() method to work properly
loop.exec();
if(NULL == resp)
{
// Error. we probably timed out i.e SIGNAL(finished()) did not happen
// this handles above indicated case (1)
return -1; // or return some timeout related error value
}
else if( QNetworkReply::NoError != resp->error() )
{
// Error - SIGNAL(finished()) was raised but get() opn failed & returned with error
// Refer http://doc.qt.io/qt-4.8/qnetworkreply.html#NetworkError-enum
// This section of code handles above indicated case (2)
}
else
{
// get() operation was Successful !.
// read the response available in the 'resp' variable as a QString & parse it.
// Obtain the necessary result and etc.
}
delete resp;
delete manager;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)