Сколько очередей событий присутствует в приложении Qt? События, такие как клик и т. Д., Помещаются в очередь в очереди. И вы также можете захватывать события, используя функцию postEvent. Все ли эти события в одной очереди? если да, то есть способ определить разные очереди?Очередь событий в Qt
ответ
Обычно в каждом потоке имеется не более одной очереди событий.
Возможно иметь дополнительные очереди событий с двумя стратегиями реализации, которые отличаются тем, совместимы ли вы с 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
.
- 1. Очередь слотов в QT
- 2. Очередь событий в SimPy
- 3. Очередь глобального события, если цикл событий Qt 5 приостановлен
- 4. Обработка тайм-аута QTimer, когда основная очередь событий Qt заблокирована
- 5. Pygame очередь событий
- 6. JQuery обработчик событий очередь
- 7. NodeJS понимает очередь событий
- 8. Очередь событий SDL
- 9. Неверная очередь событий в TRIGGER
- 10. Цикл заблокированных событий Qt
- 11. Обработчики событий в Qt
- 12. Как отслеживать очередь событий Dispatch?
- 13. очередь цикл событий и приоритет
- 14. Как реализовать простую очередь событий?
- 15. Как очистить очередь событий SDL?
- 16. Очередь значений событий старого клика.
- 17. Цикл событий QT в dll
- 18. Обработка событий в QT OpenGL
- 19. Android: отправка событий в очередь сообщений View
- 20. Ответы на вызовы, отправленные в очередь событий?
- 21. Qt: Невозможно очередь аргументы типа MyClass
- 22. Очередь/база данных для планирования событий?
- 23. Нужно очистить Java EDT (очередь отправки событий)
- 24. Android - очередь событий - выполнение после настройки предпочтения
- 25. Dart Event Queue: как отлаживать очередь событий?
- 26. Отложить очередь событий после фокуса Потеряно
- 27. Сколько событий может содержать очередь node.js?
- 28. MATLAB: смыва очередь событий с drawnow
- 29. poll (2) не пустит очередь событий
- 30. Есть ли способ очистить очередь событий Curse?
Для каждого цикла событий есть одна очередь событий. Таким образом, ответ зависит от вашего приложения: используете ли вы 'QThread', запускаете поток без QThread и вручную запускаете' QEventLoop' и т. Д.? – MrEricSir
Почему, по-вашему, вам нужно иметь несколько очередей событий в одном потоке? Чего вы пытаетесь достичь? В подавляющем большинстве случаев вам просто не нужны дополнительные очереди. Очередь по умолчанию сортируется по приоритету и поддерживает сжатие событий через частный интерфейс, поэтому, если вам нужны только высокоприоритетные или сжимаемые события, вы уже получили их. ** Просьба описать сценарий, который заставил вас поверить, что вам нужны несколько/нестандартных очередей событий **. Мы не можем сказать вам, являются ли такие очереди решениями, если вы не говорите нам, какую проблему вы пытаетесь решить **. –