Подтвердить что ты не робот

Qt 4.5 - Является ли излучающий сигнал вызовом функции или потоком и блокирует ли он?

Я не уверен в характере механизма сигнала/слота в Qt 4.5. Когда излучается сигнал, это вызов функции блокировки или поток? Скажите это

emit GrabLatestData();

// proceed with latest data

Будет ли решена вся цепочка сигналов/слотов, прежде чем перейти к следующей строке?

4b9b3361

Ответ 1

Это зависит. Из документа :

Когда выдается сигнал, подключенные к нему слоты обычно выполняются немедленно, как обычный вызов функции. Когда это происходит, механизм сигналов и слотов полностью независим от любого цикла событий GUI. Выполнение кода, следующего за инструкцией emit, произойдет после возвращения всех слотов. Ситуация несколько отличается при использовании очереди в очереди; в этом случае код, следующий за ключевым словом emit, будет продолжен немедленно, и слоты будут выполнены позже.

Таким образом, в обычных случаях он будет синхронным и блокирующим, а с поставленными соединениями он будет асинхронным и неблокирующим.

Ответ 2

Самая большая проблема заключается в том, что вы просто не можете знать. То есть, если вы смотрите с классовой точки зрения. Когда вы излучаете, вы не знаете, что произойдет:

  • Если никто не подключен к сигналу, ничего не происходит
  • Если кто-то из того же потока подключен с использованием любого типа, кроме Qt:: QueuedConnection, вызов будет блокировать
  • Если кто-то из того же потока подключен с помощью Qt:: QueuedConnection, вызов будет неблокировать
  • Если кто-то из другого потока подключен с помощью Qt:: DirectConnection (будьте очень осторожны, когда вы это делаете!) или Qt:: BlockingQueuedConnection, вызов будет блокировать
  • Если кто-то из другого потока подключен с помощью Qt:: AutoConnection или Qt:: QueuedConnection, вызов будет неблокироваться

Еще труднее узнать, что произойдет, если к сигналу будут подключены несколько объектов. В этом случае некоторые слоты могут быть запущены, а другие все еще поставлены в очередь. Между прочим, нет нити, связанной с неблокирующим подключением. Там только событие, которое отправляется в цикле событий потока принимающего объекта.

Ответ 3

laalto ответить выше правильно. Еще один момент: если все ваши QObject принадлежат одному и тому же потоку, и вы не указали вручную связанные очереди, то выполнение слотов, подключенных к сигналу, происходит синхронно - вся обработка будет выполнена до следующей строки после "emit" ' выражение. Поскольку это наиболее распространенный случай, ответ на ваш вопрос обычно "да".

Документация по сигналам и слотам для нескольких потоков может быть вам полезной.