2013-06-13 3 views
0

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

Мой вопрос будет касаться таймеров, в частности: когда таймер истекает (это должен быть другой поток), подключается ли он к сигналу «мгновенно» (например, следующая инструкция), как если бы это было прерывание, или он ждет конца какого-то цикла?

Спасибо за ваше понимание,

С уважением, Mister Mystère

ответ

3

Последний аргумент QObject :: Коннект тип соединения, который определяет, когда будет выполнен слот. От the documentation:

  • Qt :: AutoConnection - Если сигнал испускается из другого потока, чем принимающего объекта, сигнал ставится в очередь, ведет себя, как Qt :: QueuedConnection. В противном случае слот вызывается напрямую, ведет себя как Qt :: DirectConnection. Тип соединения определяется при испускании сигнала.

  • Qt :: DirectConnection - Слот вызывается немедленно, когда сигнал испускается.

  • Qt :: QueuedConnection - Слот вызывается, когда управление возвращается в цикл событий потока получателя. Слот выполнен в потоке приемника.

  • Qt :: BlockingQueuedConnection - То же, что и QueuedConnection, за исключением текущих блоков потоков до тех пор, пока слот не вернется. Этот тип подключения должен использоваться только там, где эмиттер и приемник находятся в разных потоках .

+0

Точно, что я искал, спасибо большое! –

2

http://woboq.com/blog/how-qt-signals-slots-work.html

Это кажется довольно хорошее описание, хотя я не читал его в деталях.

Главное направление: прямые соединения и отложенные соединения. Прямые соединения выполняются немедленно.

2

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

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

Смежные вопросы