2015-03-11 5 views
0

Недавно я был вовлечен в проект, где мы реализовали dll в QT. Мы столкнулись с проблемами после того, как попытались получить DLL, написанную в QT, с использованием приложения, отличного от QT, из-за отсутствия цикла событий в нашем основном потоке. Мы выяснили, как получить эту работу, не требуя очереди событий, однако есть опасения, что отсутствие очереди событий приведет к тому, что внутренняя очередь сообщений DLL будет переполнена сообщениями, сгенерированными ОС. Эта концепция нова для меня, и я надеялся, что кто-то может объяснить мне больше, действительно ли это представляет собой настоящую проблему, и какие типы сообщений, инициируемых ОС, вставляются в очередь сообщений приложений.Qt Event Loop и сообщения ОС

ответ

1

В Windows поток должен иметь хотя бы одно окно, чтобы оно могло получить очередь сообщений и получать сообщения. Окно является ресурсом ОС, а не тем, что вы обязательно видите на экране. Это возможно можно увидеть. Так что да, если вы создадите одно или несколько окон в потоке и не обрабатываете их сообщения, очереди сообщений могут в конечном итоге заполниться. И вот об этом, после этого ничего плохого не происходит. Окна, если они видны, будут заморожены/застряли, иначе вы даже не можете сказать, есть ли проблемы. Все хорошо. Вы используете немного памяти для полных очередей сообщений, но это вовсе не астрономическая сумма.

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

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

TL; DR: ОС отправит вам сообщения только в случае их ухода. Если вы этого не сделаете, вы ничего не получите. Это не так, как если бы ОС была «там, чтобы заставить вас не слушать» :)

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

  • Нет связанных вопросов^_^