Does QWebEnginePage::load() start a new event loop internally or it just calls processEvents() ?
-
After debugging an application crash, I have found that QWebEnginePage::load() internally processes queued events and causes unexpected re-entrancy in my code.
I have modified my code to handle reentrancy, but there are parts of my code that invoke deleteLater(). To be sure that some objects will not get deleted while within QWebEnginePage::load(), I would like to know if that method starts internally an event loop or it just calls processEvents() ?Thanks in advance.
-
@comy said in Does QWebEnginePage::load() start a new event loop internally or it just calls processEvents ?:
I would like to know if that method starts internally an event loop or it just calls processEvents().
Having recently struggled with
QWebEnginePage
and the freeing of objects. My confused-and-without-guarantee finding was thatthingies->deleteLater()
did not free them until I returned to the main Qt event loop. Just like calling onlyprocessEvents()
. Which for me was just what I did not want, but I think for you it is what you'd like.As per https://doc.qt.io/qt-5/qcoreapplication.html#processEvents, these are DeferredDelete events.
I think you know that, and from the way you phrased your question you know more than I! So I should like to ask you a question!
When you say
start a new event loop internally or it just calls
processEvents
and the docs say
In the event that you are running a local loop which calls this function continuously, without an event loop
I don't understand just what is meant beyond calling
processEvents()
? What is/how do you write a "new local event loop" instead? -
@JonB Starting a new local event loop is done by executing QEventLoop::exec(). That is what for example QDialog::exec() does. It blocks and performs event processing, where processEvents just processes what is in the queue and returns.
I hope somebody can confirm to me that this is not the case with QWebEnginePage::load(), for which I know it does process events, just not sure if by starting event loop or with call to processEvents(). -
@comy said in Does QWebEnginePage::load() start a new event loop internally or it just calls processEvents() ?:
@JonB Starting a new local event loop is done by executing QEventLoop::exec().
Oh I see, just
QEventLoop::exec()
. Yes, I had tried that. According to me it made no difference, anddeleteLater()
s ofQWebEngine
stuff still didn't free till execution got back to my top-level Qt event loop. Didn't understand why, your mileage may vary :)