Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Signal execution order with Qt::QueuedConnection

Tags:

c++

qt

I have two signals A and B emitted one after another from an object in thread X, and the two connected slots are in the Main thread. The connection is QueuedConnection (due to multithreading connect). My question is: is the order of the signals respected in their call to the slots, or is there a chance for them to be executed in an arbitrary order?

like image 758
Stefano Borini Avatar asked Apr 24 '13 09:04

Stefano Borini


People also ask

What is Qt Queuedconnection?

Queued Connection The slot is invoked when control returns to the event loop of the receiver's thread. The slot is executed in the receiver's thread. Blocking Queued Connection The slot is invoked as for the Queued Connection, except the current thread blocks until the slot returns.

How does Qt signal slot work?

In Qt, we have an alternative to the callback technique: We use signals and slots. A signal is emitted when a particular event occurs. Qt's widgets have many predefined signals, but we can always subclass widgets to add our own signals to them. A slot is a function that is called in response to a particular signal.

How do you wait for a signal in Qt?

You can use a local event loop to wait for the signal to be emitted : QTimer timer; timer. setSingleShot(true); QEventLoop loop; connect( sslSocket, &QSslSocket::encrypted, &loop, &QEventLoop::quit ); connect( &timer, &QTimer::timeout, &loop, &QEventLoop::quit ); timer.


2 Answers

Both of your signals will be queued in a single event queue of the X thread, so corresponding slots will be executed in the order of signals were emitted.

But in the following case you can't rely on the slots execution order:

signal A connected to a slot in X thread
signal B connected to a slot in Y thread

Also, there is a Qt::BlockingQueuedConnection connection type. If you connect your first signal using it, your current thread will be blocked until the corresponding slot in another thread finishes its job.

like image 150
hank Avatar answered Sep 21 '22 18:09

hank


According to current QT sources (5.*) they will be dispatched in sequence they were emitted using FIFO algorithm. But as stated in comment there is nothing in documentation which specifies this order so I wouldn't suggest to relay on that behaviour.

like image 38
evilruff Avatar answered Sep 23 '22 18:09

evilruff