Is it possible for this Qt code to run into an infinite loop?
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;
This is basically a “synchronous” way to display the contents of a webpage.
I have not observed any issues using it, but I considered the following scenario:
- The
finishedsignal ofreplyis emitted before the event loop is created and the signal-slot connection betweenfinishedandquitis made - No signal will be emitted from that point forward thus never triggering
quit loop.exec()will continually loop
Is it possible for that to occur, or am I not understanding something about how the Qt event loop works?
While Qt executes your own code (the code above, for example), it can’t process new signals and call slots. Every signal was emitted while your method is executing will be processed later. If you want to force processing of signals in middle of your method, you can call QCoreApplication::processEvents to process signals in your current event loop or QEventLoop::exec to do it in another loop.
So this code is safe. If a signal comes too fast, it will wait in the event queue.
If you’re emitting a signal and there are slots connected to this signal using Qt::DirectConnection, these slots will be executed immediately. But this doesn’t match your case. Qt have to execute some internal code before the singal will be emitted. It can’t execute this code while your method is executing. There are only one thread and only one call stack.
Note that when you’re using Qt threads event loops’ behaviour is more complicated.