QObject based class has a queued connection to its

2019-02-22 13:34发布

问题:

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?

回答1:

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



回答2:

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.