2015-08-23 3 views
0

Сколько очередей событий присутствует в приложении Qt? События, такие как клик и т. Д., Помещаются в очередь в очереди. И вы также можете захватывать события, используя функцию postEvent. Все ли эти события в одной очереди? если да, то есть способ определить разные очереди?Очередь событий в Qt

+0

Для каждого цикла событий есть одна очередь событий. Таким образом, ответ зависит от вашего приложения: используете ли вы 'QThread', запускаете поток без QThread и вручную запускаете' QEventLoop' и т. Д.? – MrEricSir

+0

Почему, по-вашему, вам нужно иметь несколько очередей событий в одном потоке? Чего вы пытаетесь достичь? В подавляющем большинстве случаев вам просто не нужны дополнительные очереди. Очередь по умолчанию сортируется по приоритету и поддерживает сжатие событий через частный интерфейс, поэтому, если вам нужны только высокоприоритетные или сжимаемые события, вы уже получили их. ** Просьба описать сценарий, который заставил вас поверить, что вам нужны несколько/нестандартных очередей событий **. Мы не можем сказать вам, являются ли такие очереди решениями, если вы не говорите нам, какую проблему вы пытаетесь решить **. –

ответ

1

Обычно в каждом потоке имеется не более одной очереди событий.

Возможно иметь дополнительные очереди событий с двумя стратегиями реализации, которые отличаются тем, совместимы ли вы с QCoreApplication::postEvent.

Если вам не все равно QCoreApplication::postEvent, работая с вашей очередью, все зависит от вас. Вы можете реализовать очередь любым способом. Обратите внимание, что Qt не реализует способ маркировки QObject как принадлежащего к определенной очереди событий. Когда вы готовы доставить события из своей очереди, вы просто вызываете QCoreApplication::notify, передавая ему указатель на целевой объект и указатель на события. Очень просто. Разумеется, вы не имеете никакого контроля над событиями, которые доставляются к любому объекту из очереди по умолчанию.

Другой способ - оставаться совместимым с QCoreApplication::postEvent. А именно, вы как-то «отмечаете» объект как имеющий свои события, обрабатываемые вашей очередью. Вы перехватываете событие, которое должно быть доставлено к цели, помещено в очередь и обрабатывать его самостоятельно по мере необходимости.

Это QStateMachine-like hack. Это хорошо. И плохо. И вещи между ними. Стоит знать, как это делается и почему.

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

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

Затем, когда исходное событие достигает целевого объекта, фильтр перехватывает событие, а предотвращает его доставку целевому объекту. Теперь он должен сделать копию события и вставить его в свою очередь. Копия должна быть сделана, поскольку событие будет удалено диспетчером событий, как только элемент управления покинет фильтр событий и/или метод event() целевого объекта.

К сожалению, QEvent s не являются клонируемыми - по крайней мере, не публично. Существует clone functionality hidden in Qt's innards, usable by user code, но это частный API, а не на основе идиомы конструктора виртуальной копии.

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

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