首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >这段代码可能会遇到无限循环吗?

这段代码可能会遇到无限循环吗?
EN

Stack Overflow用户
提问于 2012-05-13 08:01:08
回答 2查看 317关注 0票数 4

这个Qt代码有可能运行到一个无限循环中吗?

代码语言:javascript
代码运行次数:0
运行
复制
QNetworkAccessManager m;
QNetworkReply *reply = m.get(QNetworkRequest(QUrl("http://www.example.org/")));
QEventLoop loop;
QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
loop.exec();
qDebug() << reply->readAll();
delete reply;

这基本上是一种显示网页内容的“同步”方式。

我没有观察到任何使用它的问题,但我考虑了以下情况:

  • 在创建事件循环之前发出replyreply信号,并在finishedquit之间建立信号槽连接。
  • 不会从这一点发出任何信号,因此永远不会触发quit
  • loop.exec()将持续循环

这种情况有可能发生,还是我不了解Qt事件循环是如何工作的?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-13 08:17:30

当Qt执行您自己的代码(例如上面的代码)时,它不能处理新的信号和调用插槽。在执行方法时发出的每个信号将在稍后处理。如果要强制处理方法中间的信号,可以调用QCoreApplication::processEvents处理当前事件循环中的信号,或者调用QEventLoop::exec在另一个循环中处理信号。

所以这个密码是安全的。如果信号来得太快,它将在事件队列中等待。

如果您正在发出一个信号,并且有一些插槽使用Qt::DirectConnection连接到此信号,这些插槽将立即执行。但这不符合你的情况。在发出信号之前,Qt必须执行一些内部代码。当您的方法执行时,它无法执行此代码。只有一个线程和一个调用堆栈。

注意,当您使用Qt线程时,事件循环的行为要复杂得多。

票数 1
EN

Stack Overflow用户

发布于 2012-05-13 13:25:24

在运行loop.exec()之前,您可以检查reply->isFinished()。如果是的话,就不要执行循环。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10570188

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档