![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| Bogdan1024 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1436 Регистрация: 28.9.2005 Где: Киев Репутация: нет Всего: 13 |
Основной цикл программы:
Я думаю, что таким образом из очереди событий изымается только одно событие и оно же обрабатывается, верно? Тогда если за один цикл событий приходит больше чем одно, то очередь будет просто заваленна событиями, что вовсе не гуд. Я прав? И ещё: события окну могут посылаться двумя способами: SendMessage и PostMessage. Если какая-то гадина пошлёт окошку событие SendMessage'эм, то программа прекратит делать то, что она делала, срочно обработает событие и продолжит делать то, что делала? А если послать два SendMessage'а подряд, при чём так, что второй придёт тогда, когда будет обрабатываться первый, то программа прекратит обрабатывать первый мэссэдж, начнёт обрабатывать второй, а когда закончит, продолжит обрабатывать первый? -------------------- ![]() |
|||
|
||||
| 0x07L |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 272 Регистрация: 10.6.2006 Где: Москва Репутация: 4 Всего: 5 |
Никакое сообщение прервать работу твоей программы не может. Программа продолжит свою работу и обработает твое сообщение тогда, когда хочет.
Программа же, пославшая SendMessage'м сообщение, будет ждать, пока сообщение обработается (говоря точнее, функция SendMessage возвращает управление, когда заканчивается обработка сообщения).
Ситуация, когда очередь "завалена" сообщениями, вполне нормальная. PS А зачем тебе такой цикл обработки сообщений? Стандартный (с GetMessage) более эффективен. |
|||
|
||||
| Bogdan1024 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1436 Регистрация: 28.9.2005 Где: Киев Репутация: нет Всего: 13 |
А если я сам себе пошлю SendMessage(hwnd,WM_CLOSE,0,0), то программа таки всё бросит и обработает его, хотя теоретически она должна ждать пока оно обработается (когда программа сделает PeekMessage), но PeekMessage по идее должен никогда не наступить потому что программа ожидает пока обработается сообщение и дальше не работает, хотя этого не происходит...
Это пример из книги -------------------- ![]() |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
Там еще и комментарий неправильный, вводящий в заблуждение: TranslateMessage вовсе не транслирует акселераторы, это делает TranslateAccelerators.
Выкинь книгу. Когда ты сам посылаешь сообщение SendMessage, все зависит от того, кому: если окну того же потока, то программа (твой поток) в этот момент именно это и делает, т.е. посылает сообщение, потом обрабатывает его (сразу). Вызывающая функция ждет, когда сообщение будет обработано. Использовать GetMessage вместо PeekMessage вовсе не более эффективно. GetMessage немного проще, но PeekMessage дает больший контроль. -------------------- ... |
|||
|
||||
| takedo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 501 Регистрация: 1.6.2005 Репутация: -1 Всего: 3 |
Bogdan1024, ты зря паришься. В виндовс в окне есть несколько очередей сообщений 1)PostMessage, 2)SendMessage. 2) имеет больший приоритет, чем 1). Ещ1 больший приоритет имеет SendNotifyMessage - тоже синхронное кстати сообщение
-------------------- я не гольфист - я хоккеист |
|||
|
||||
| Earnest |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
takedo, не совсем прав: SenвMessage не ставится в очередь, а приводит к прямому вызову оконной процедуры. Даже если вызов из другого потока. Хотя в этом случае ждать, возможно, придется долго, и даже можно получить deadlock:
Что касается SendNotifyMessage, то при вызове в рамках одного потока она неотличима от SendMessage, а вот при вызове из другого потока - возвращается немедленно. Однако это еще не значит, что сообщение будут немедленно обработано.
Насчет рекомендации почитать Рихтера - присоединяюсь. -------------------- ... |
||||
|
|||||
| Bogdan1024 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1436 Регистрация: 28.9.2005 Где: Киев Репутация: нет Всего: 13 |
Огромное спасибо всем, кто ответил в этом топике! Вы не поверите на сколько противоречивые ответы я получал по этому вопросу!
А что именно у Рихтера читать? -------------------- ![]() |
|||
|
||||
| 0x07L |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 272 Регистрация: 10.6.2006 Где: Москва Репутация: 4 Всего: 5 |
Я где-то слышал, что GetMessage, если очередь сообщений пуста, ждет сообщения, а PeekMessage в таком случае сразу возвращает управление. |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
Да, именно так. "Услышать" это можно в MSDN.
Используя PeekMessage, можно, например, организовать обработку on-idle. -------------------- ... |
|||
|
||||
| 0x07L |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 272 Регистрация: 10.6.2006 Где: Москва Репутация: 4 Всего: 5 |
Вот это я и имел в виду, говоря про бОльшую эффективность GetMessage. Если очередь сообщений пуста, то при PeekMessage мы будем крутиться в цикле, напрасно тратя время (процессорное), а при GetMessage будем просто ждать, пока сообщение не придет.
|
|||
|
||||
| BreakPointMAN |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 15.9.2004 Где: Saratov Репутация: нет Всего: 24 |
"Windows для профессионалов: создание эффективных Win32 приложений с учетом специфики 64-разрядной версии Windows" © Джеффри Рихтер - главу 26, "Оконные сообщения". -------------------- "Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце") |
|||
|
||||
| HappyLife |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 642 Регистрация: 17.5.2006 Репутация: нет Всего: 8 |
Мы все равно крутимся в цикле, но этот цикл расположен в самом внутреннем коде GetMessage |
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 2 Всего: 110 |
если бы это было так, любая программа, использующая этот способ, стремилась бы занять всё свободное процессорное время, чтобы выполнить кучу инструкций типа jump 0 когда нет сообщений, вызов GetMessage приводит к остановке потока, а система уже решает, когда его продолжить (т.е. когда к нему придут сообщения) скорее всего, используется что-то вроде механизма WaitForSingleObject и т.п. ... -------------------- qqq |
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |