Как Qt обрабатывает события и сигналы в одном EventLoop - PullRequest
0 голосов
/ 09 апреля 2020

Я не мог понять, как qt обрабатывает события (например, событие таймера, событие сокета и т. Д. c.) И сигналы в одном и том же событии. L oop. Как я понимаю, события таймера и сокета обрабатываются с помощью системного вызова select ( в Unix как ОС).

Как событие l oop обрабатывает сигналы во время сна из-за системного вызова select.

1 Ответ

0 голосов
/ 09 апреля 2020

В Qt сигналы используются для вызова слотов. Когда вы излучаете сигнал, есть, грубо говоря, только 2 варианта вызова соответствующего слота:

  1. Прямой вызов слота. Это можно рассматривать как замену линии сигналом, излучаемым линией, только с вызовом слота. Событие l oop не используется для обработки самого этого сигнала.
  2. Задержка вызова слота. В этом случае сигнал будет преобразован в событие, и событие будет опубликовано в событии получателя l oop (, которое ставится в очередь в событии l oop потока, в котором находится объект получателя. ). Отныне для обработчика события l oop не имеет значения, был ли это сигнал или событие. Событие будет подхвачено событием l oop и вызовет вызов слота через некоторое время.

Из Qt do c: https://doc.qt.io/qt-5/signalsandslots.html#signals

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

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

QQueue<QEvent> eventQueue; // Events (and pending slot calls as well) are added to this queue
...

// How an event loop works (schematically):
while(event = eventQueue.dequeue())
{
    do_what_the_event_wants_or_ignore_it(event);
}

Читайте также https://wiki.qt.io/Threads_Events_QObjects

...