Qt 4.5 - Является ли излучающий сигнал вызовом функции или потоком и блокирует ли он?
Я не уверен в характере механизма сигнала/слота в Qt 4.5. Когда излучается сигнал, это вызов функции блокировки или поток? Скажите это
emit GrabLatestData();
// proceed with latest data
Будет ли решена вся цепочка сигналов/слотов, прежде чем перейти к следующей строке?
Ответы
Ответ 1
Это зависит. Из документа :
Когда выдается сигнал, подключенные к нему слоты обычно выполняются немедленно, как обычный вызов функции. Когда это происходит, механизм сигналов и слотов полностью независим от любого цикла событий GUI. Выполнение кода, следующего за инструкцией emit
, произойдет после возвращения всех слотов. Ситуация несколько отличается при использовании очереди в очереди; в этом случае код, следующий за ключевым словом emit, будет продолжен немедленно, и слоты будут выполнены позже.
Таким образом, в обычных случаях он будет синхронным и блокирующим, а с поставленными соединениями он будет асинхронным и неблокирующим.
Ответ 2
Самая большая проблема заключается в том, что вы просто не можете знать. То есть, если вы смотрите с классовой точки зрения. Когда вы излучаете, вы не знаете, что произойдет:
- Если никто не подключен к сигналу, ничего не происходит
- Если кто-то из того же потока подключен с использованием любого типа, кроме Qt:: QueuedConnection, вызов будет блокировать
- Если кто-то из того же потока подключен с помощью Qt:: QueuedConnection, вызов будет неблокировать
- Если кто-то из другого потока подключен с помощью Qt:: DirectConnection (будьте очень осторожны, когда вы это делаете!) или Qt:: BlockingQueuedConnection, вызов будет блокировать
- Если кто-то из другого потока подключен с помощью Qt:: AutoConnection или Qt:: QueuedConnection, вызов будет неблокироваться
Еще труднее узнать, что произойдет, если к сигналу будут подключены несколько объектов. В этом случае некоторые слоты могут быть запущены, а другие все еще поставлены в очередь.
Между прочим, нет нити, связанной с неблокирующим подключением. Там только событие, которое отправляется в цикле событий потока принимающего объекта.
Ответ 3
laalto ответить выше правильно. Еще один момент: если все ваши QObject принадлежат одному и тому же потоку, и вы не указали вручную связанные очереди, то выполнение слотов, подключенных к сигналу, происходит синхронно - вся обработка будет выполнена до следующей строки после "emit" ' выражение. Поскольку это наиболее распространенный случай, ответ на ваш вопрос обычно "да".
Документация по сигналам и слотам для нескольких потоков может быть вам полезной.