Qt 4.5 - действительно ли испускающий сигнал является вызовом функции или потоком, и делает это блоки?

Мое принятие желаемого за действительное - то, что, если программное обеспечение создается государственными служащими или заказным программным обеспечением, созданным для правительства подрядчиком, это должно быть автоматически в общественном достоянии (как опубликованные документы всего правительства). Если бы правительство купило программное обеспечение у компании, даже если бы это включало некоторую настройку, это должно остаться закрытым исходным кодом. Вы сталкиваетесь с чем-то вроде серой области, где она была разработана подрядчиками для правительства, но могла тогда быть продана в качестве коммерческого продукта (если кто-либо был достаточно глуп купить программное обеспечение, созданное для правительства... посмотрите The Daily WTF для ссылок)... Я не знаю, как разрешить, что, но несмотря на мое требование FOSS, я думаю, что он лучше всего допускает ошибку на стороне бизнеса в этом случае.

я также думаю, что правительство должно быть обязано использовать существующее программное обеспечение с открытым исходным кодом, если это - жизнеспособный конкурент решения с закрытым исходным кодом. Это сохранило бы некоторые налоговые поступления и способствовало бы правительственной открытости (не в смысле программного обеспечения, хотя это будет хорошо также).

, Как мы заставляем его произойти?: D

36
задан troyane 26 November 2012 в 22:33
поделиться

3 ответа

Это зависит от обстоятельств. Из документации :

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

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

47
ответ дан 27 November 2019 в 05:34
поделиться

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

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

9
ответ дан 27 November 2019 в 05:34
поделиться

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

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

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

27
ответ дан 27 November 2019 в 05:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: