这段代码可能会陷入无限循环吗?
Could this code potentially run into an infinite loop?
这个Qt代码是否有可能陷入无限循环?
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;
这基本上是显示网页内容的"同步"方式。
我没有观察到使用它的任何问题,但我考虑了以下情况:
reply
的finished
信号在创建事件环路之前发出,并在finished
和quit
之间建立信号槽连接- 从该点开始不会发出任何信号,因此永远不会触发
quit
-
loop.exec()
将不断循环
是否有可能发生这种情况,或者我对Qt事件循环的工作原理有所了解?
虽然Qt执行你自己的代码(例如上面的代码),但它不能处理新信号和调用时隙。在执行方法时发出的每个信号都将在以后进行处理。如果要在方法中间强制处理信号,可以调用QCoreApplication::p rocessEvents来处理当前事件循环中的信号,或调用QEventLoop::exec在另一个循环中处理信号。
所以这个代码是安全的。如果信号来得太快,它将在事件队列中等待。
如果您正在发射信号,并且有插槽使用 Qt::D irectConnection 连接到该信号,则这些插槽将立即执行。但这与您的情况不符。Qt必须在发出单曲之前执行一些内部代码。它无法在执行方法时执行此代码。只有一个线程和一个调用堆栈。
请注意,当您使用Qt线程时,事件循环的行为更加复杂。
在运行loop.exec()
之前,你可以检查reply->isFinished()
。如果是,请不要执行循环。
相关文章:
- 在java中解决这段代码时面临循环中的问题
- 在做一段时间内检查字符的无限循环
- 为什么这段代码会导致无限循环?
- 任何人都可以弄清楚这段代码如何显示运行错误?它打印无限时间 -1 以及正确答案
- 试图找出为什么我的代码保持无限循环
- C++代码崩溃并具有无限循环
- 为什么我的代码在 c++ 中无限循环.我的代码需要反复提示用户
- 从二进制文件加载列表后,我的代码似乎进入了无限循环
- QuickSort中使用的Hoare分区代码(Ref Cormen Book)陷入无限循环
- 为什么我的埃拉托色尼代码筛子无限循环.我已经用几个数字进行了测试
- 为什么这段代码陷入无限循环?
- 这段代码处于无限循环中,想知道如何解决它
- 这段代码如何在没有任何循环语句或'goto'或递归的情况下循环?
- 在给定长度无限循环的情况下,在Collatz猜想中查找起始数的代码
- 为什么下面的代码进入无限循环
- 为什么这段代码最终会进入一个无限循环,读取std::cin
- 这段代码可能会陷入无限循环吗?
- 为什么这段代码没有给出任何输出?这似乎是一个无限循环
- c++中,当我执行这段代码时,会得到一个无限循环
- 在这段代码中查找3个错误,这些错误都会导致无限循环