这个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
的reply
信号,并在finished
和quit
之间建立信号槽连接。quit
。loop.exec()
将持续循环这种情况有可能发生,还是我不了解Qt事件循环是如何工作的?
发布于 2012-05-13 00:17:30
当Qt执行您自己的代码(例如上面的代码)时,它不能处理新的信号和调用插槽。在执行方法时发出的每个信号将在稍后处理。如果要强制处理方法中间的信号,可以调用QCoreApplication::processEvents处理当前事件循环中的信号,或者调用QEventLoop::exec在另一个循环中处理信号。
所以这个密码是安全的。如果信号来得太快,它将在事件队列中等待。
如果您正在发出一个信号,并且有一些插槽使用Qt::DirectConnection连接到此信号,这些插槽将立即执行。但这不符合你的情况。在发出信号之前,Qt必须执行一些内部代码。当您的方法执行时,它无法执行此代码。只有一个线程和一个调用堆栈。
注意,当您使用Qt线程时,事件循环的行为要复杂得多。
发布于 2012-05-13 05:25:24
在运行loop.exec()
之前,您可以检查reply->isFinished()
。如果是的话,就不要执行循环。
https://stackoverflow.com/questions/10570188
复制