【发布时间】:2015-06-09 13:39:29
【问题描述】:
我有疑问应该如何使用QEventLoop。我有 2 段代码,它们都对我有用(下载网络资源)。
第一个:
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()?我在某处找到了第二个解决方案,但对我来说似乎不合适,所以我将其修改为第一段代码。
【问题讨论】:
-
你想在第二种情况下如何中断事件循环?首先是可以的,但你也应该处理错误。
-
是的,这就是我所担心的,所以我改变了它。我只是不确定我的想法是否正确,所以我问了
-
一般你都不应该使用——QApplication已经为主线程设置了一个事件循环,而QThread为后台线程设置了一个事件循环。
-
本地 QEventLoops 是万恶之源。 (因为所有类型的事情都可能在 loop.exec() 返回之前发生)。连接完成到另一个插槽,然后继续。
-
我同意弗兰克的观点,在这种情况下使用事件循环似乎太过分了,可能会产生复杂的问题
标签: qt qtnetwork qeventloop