QMetaObject::invokeMethod with Qt::BlockingQueuedConnection from render thread
-
Hi,
I have a
QQuickFramebufferObject
where I would like to call an external rendering function (written in Julia). Because Julia is not thread-safe, the rendering function must be called from the main thread. The easiest solution is to just setQSG_RENDER_LOOP
tobasic
, but that is easy to forget and sub-optimal for other components in the scene graph.Looking at the scene graph documentation, I thought it would have been possible to call back into the main thread using
QMetaObject::invokeMethod
with aQt::BlockingQueuedConnection
from withinQQuickFramebufferObject::Renderer::render
, but this seems to result in a deadlock. Using just aQt::QueuedConnection
doesn't work either, because then the rendering function gets called after the context is invalidated.It seems that the GUI thread does not continue processing events until
QQuickFramebufferObject::Renderer::render
has completed, even though the docs state that the GUI thread is unblocked during render? The documentation forQQuickFramebufferObject
even states: "Using queued connections or events for communication between item and renderer is also possible".Cheers,
Bart
-
I have added a stand-alone test case here:
https://github.com/barche/render-threadsThe problem is at line 18 in fborender.cpp:
https://github.com/barche/render-threads/blob/master/fborender.cpp#L18Is the use of a
Qt::BlockingQueuedConnection
somehow disallowed here?