[Interest] Expected event execution order in this multi-thread application
Thiago Macieira
thiago.macieira at intel.com
Sun Oct 6 19:18:44 CEST 2019
On Saturday, 5 October 2019 06:13:56 PDT Richard Weickelt wrote:
> >> Because I attached a debugger and stopped T1 during
> >> QCoreApplication::processEvents(). I can see E3 (the one that the thread
> >> is
> >> currently processing) in postEventList at index 0 and E2 at index 1.
> >> That's
> >> it. From there I see the following call chain
> >> QEventDispatcherGlib::processEvents() followed by emit awake() because
> >> canWait is false. I haven't traced it further. The signal emission
> >> doesn't
> >> have any consequence in the event loop though.
> >
> > Can you check what happens when it calls into
> > QCoreApplicationPrivate::sendPostedEvents()? That function should loop
> > from
> > data->postEventList.startOffset to data->postEventList.size() (size at the
> > time you call into the function, so no new events wil be handed).
> > Like you said, it should be handled on the first iteration after it's been
> > queued.
>
> The problem is that my explicit calls to QCoreApplication::processEvents()
> do not reach QCoreApplicationPrivate::sendPostedEvents(). I found the root
> cause:
[snip]
Thanks for the detailed debugging, Richard, and for the bug report you filed.
Looks like I wasn't seeing the problem because I was looking at the UNIX event
dispatcher, but you're running against the Glib one. I usually prefer reading
the source of the former because I can scroll through all of it. With the Glib
one, since it goes through Glib and comes back out via callbacks, it's hard to
follow.
And that's exactly the problem: because of the need for callbacks, it's saving
the state for too long. There's a difference in behaviour between the two
dispatchers and that needs to be fixed.
> > It's not broken, that's why it's not deprecated. But that doesn't mean
> > it's a good API. It's not advisable to use nested event loops.
> > processEvents() is just the worst kind of nested event loops.
>
> Sure. Unfortunately, our application relies on QScriptEngine and requires
> that the engine's thread stays somewhat responsive. Now that I understand
> the problem, I might be able to implement a work-around in our application.
You may want QT_NO_GLIB=1 or just not build with Glib support.
--
Thiago Macieira - thiago.macieira (AT) intel.com
Software Architect - Intel System Software Products
More information about the Interest
mailing list