QObject based class has a queued connection to itself
Asked Answered
P

2

7

I was digging into some source code I am working on. I found a peculiar statement that someone had coded. The source code is a GUI application with a QML GUI and uses QT 4.7.x.

The snippet below belongs to core application logic.

// connect signal-slots for decoupling
QObject::connect (this, SIGNAL(setCurrentTaskSignal(int)), this, 
    SLOT(SetCurrentTaskSlot(int)), Qt::QueuedConnection);

It's strange that the object connects to itself via a queued connection which essentially means that the object may "live" in different threads at the same time?

At first glance It didn't made any sense to me. Can anyone think of any reason why such a connection would be plausible or needed?. Would this even work?

Popeyed answered 27/6, 2012 at 15:41 Comment(0)
B
12

It will work without any problem. Maybe there was some event loop processing required before calling SetCurrentTaskSlot?

Note that QueuedConnection doesn't mean that something is in different thread. QueuedConnection means only that when signal is emitted, corresponding slot won't be called directly. It will be queued on event loop, and will be processed when control will be given back to event loop

Bilabial answered 27/6, 2012 at 15:52 Comment(2)
Makes sense. I am still looking at the things surrounding the code. So I will be back once its clear whats happening.Popeyed
So it looks like a task change signal is emitted while performing some computation and that "change" should not occur immediately, but after the current flow is executed and the event processing resumes.Popeyed
F
4

The queued connection implies nothing about where the receiver lives. The opposite is true: to safely send signals to an object living in another thread, you must use queued connections. But you can use them for an object living in any thread!

One uses a queued connection to ensure that the signal will be delivered from within the event loop, and not immediately from the emit site as happens with direct connection. Direct connection is conceptually a set of calls to function pointers on a list. Queued connection is conceptually an event sent to a clever receiver who can execute a function call based on the contents of the event.

The event is the internal QMetaCallEvent, and it is QObject::event that acts upon this event and executes the call.

Fondafondant answered 27/6, 2012 at 17:39 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.