Является ли очередь событий той же самой очередью, которая используется для сигналов / слотов между потоками (в Qt)? - PullRequest
3 голосов
/ 13 декабря 2011

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

Так что, чтобы было ясно, у нас есть:

  • одна очередь для события
  • одна очередь для сигнала (которая не может быть выполнена напрямую из-за выброса / слота в разных потоках)

или у нас

  • одна очередь для события и сигнала

1 Ответ

3 голосов
/ 13 декабря 2011

Есть одна очередь. invokeMethod () создает QEvent, который является «QMetaCallEvent». Это индекс события 43, и вы можете увидеть его здесь как QEvent::MetaCall:

http://doc.qt.io/qt-5/qevent.html#Type-enum

Он помещается в очередь в qmetaobject.cpp ..., где "invoking" запускает вызов QApplication postEvent . Вот ссылка на эту строку на момент написания на момент обновления неработающие хитрые ссылки

/src/corelib/kernel/qmetaobject.cpp строка 2228

Не передается параметр «priority», поэтому вызовы сигнала / слота всегда будут Qt :: NormalEventPriority .

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

...