9
votes

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?

2
I always thought they are executed in emission order, because they will be added as events in the event queue as they are emitted with identical priority (because on what criteria would it modify the priority?). However I can't find any docs to confirm this, nor have I looked in the source code...cmannett85

2 Answers

7
votes

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.

5
votes

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.