2013-08-15 2 views
0

Я провел некоторое исследование по этой теме. thread в SO также заинтересовал меня, и я хотел обобщить свое понимание и исправить, если я ошибаюсь по определенному пути, а также хотел знать, как будет работать QueuedConnection.QT Является слотом, запущенным в отдельной теме

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

ответ

7

Слоты не принадлежат к какой-либо конкретной теме, так как они просто функции. Но объекты делают. Если вы подключите сигнал к слоту на QueuedConnection, то излучение сигнала создаст событие и отправит его в очередь событий цели. Qt организует, что ваш слот будет вызываться при внутренней обработке этого события.

Что касается всех событий, то они обрабатываются в потоке темы сродства. Вы можете изменить этот поток, вызвав moveToThread на целевой объект.

+0

Спасибо за объяснение, не могли бы вы объяснить, что вы подразумеваете под объектами? – Rajeshwar

+2

Сродство к потоку объекта, вообще говоря, представляет собой поток, в котором будут работать его методы (при вызове через диспетчер событий объекта). Например. если вы вызываете 'myObject.moveToThread (myThread)', тогда любой метод, который вызывается на этом объекте * через сигналы/слоты *, будет выполняться в 'myThread', НЕ в потоке, из которого было создано событие. Таким образом, сигналы/слоты могут использоваться, чтобы объекты сообщали друг другу о вещах через «границы потоков». – CmdrMoozy

+0

", из которого было создано событие. - Я бы избегал здесь термина« событие », так как его можно было смутить с системой событий Qt, с которой не нужно ничего делать. –

0

Грубо говоря, для QueuedConnection Qt сделает очередь принятых сигналов для потока, к которому принадлежит слот, и будут запускать их один за другим, чтобы они были сохранены в очереди, когда поток становится доступным (он заканчивает все, что он делает, и возвращается в цикл событий).

Нет новые потоки не будут запущены - слот принадлежит к какой-нити, поэтому выполнение будет выполняться в этом потоке.

1

В многопоточном environement, когда отправитель и объект recievr в diffrent потока.

Qt :: QueuedConnection

  • Что происходит, когда нить непосредственно излучающих? она просто излучает (внутренне postevent, чтобы Ресивер резьбы очереди сообщений) и резюме EMITER нити (не блокирующие).
  • , что происходит на Ресивер нить, после выполнения выше заявления? Слот вызывается, когда управление возвращается в цикл событий нити получателя.

Qt :: BlockingQueuedConnection

  • Что происходит на нити непосредственно излучающих? он испускает (внутренне SendEvent, в Ресивер очередь сообщений) и блок EMITER нити до приемника слот returnes. (Блокировка).
  • что происходит на приемной нитке? Слот вызывается, когда управление возвращается в цикл событий потока получателя.
Смежные вопросы