Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> PeekMessage 
V
    Опции темы
Bogdan1024
  Дата 18.6.2006, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1436
Регистрация: 28.9.2005
Где: Киев

Репутация: нет
Всего: 13



Основной цикл программы:
Цитата

while(TRUE)
    {
    // test if there is a message in queue, if so get it
    if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
    { 
    // translate any accelerator keys
    TranslateMessage(&msg);
    // send the message to the window proc
    DispatchMessage(&msg);
    } // end if
    } // end while

Я думаю, что таким образом из очереди событий изымается только одно событие и оно же обрабатывается, верно? Тогда если за один цикл событий приходит больше чем одно, то очередь будет просто заваленна событиями, что вовсе не гуд. Я прав?
И ещё: события окну могут посылаться двумя способами: SendMessage и PostMessage. Если какая-то гадина пошлёт окошку событие SendMessage'эм, то программа прекратит делать то, что она делала, срочно обработает событие и продолжит делать то, что делала? А если послать два SendMessage'а подряд, при чём так, что второй придёт тогда, когда будет обрабатываться первый, то программа прекратит обрабатывать первый мэссэдж, начнёт обрабатывать второй, а когда закончит, продолжит обрабатывать первый? 


--------------------
user posted image
PM MAIL   Вверх
0x07L
Дата 18.6.2006, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 10.6.2006
Где: Москва

Репутация: 4
Всего: 5



Никакое сообщение прервать работу твоей программы не может. Программа продолжит свою работу и обработает твое сообщение тогда, когда хочет.

Программа же, пославшая SendMessage'м сообщение, будет ждать, пока сообщение обработается (говоря точнее, функция SendMessage возвращает управление, когда заканчивается обработка сообщения).

Цитата(Bogdan1024 @  18.6.2006,  19:22 Найти цитируемый пост)
очередь будет просто заваленна событиями, что вовсе не гуд. Я прав?


Ситуация, когда очередь "завалена" сообщениями, вполне нормальная.

PS А зачем тебе такой цикл обработки сообщений? Стандартный (с GetMessage) более эффективен.
 
PM MAIL   Вверх
Bogdan1024
Дата 19.6.2006, 00:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1436
Регистрация: 28.9.2005
Где: Киев

Репутация: нет
Всего: 13



А если я сам себе пошлю SendMessage(hwnd,WM_CLOSE,0,0), то программа таки всё бросит и обработает его, хотя теоретически она должна ждать пока оно обработается (когда программа сделает PeekMessage), но PeekMessage по идее должен никогда не наступить потому что программа ожидает пока обработается сообщение и дальше не работает, хотя этого не происходит...
Цитата
PS А зачем тебе такой цикл обработки сообщений? Стандартный (с GetMessage) более эффективен.

Это пример из книги smile А какой стандартный? Тот, который обрабатывает циклически все сообщения? 


--------------------
user posted image
PM MAIL   Вверх
Earnest
Дата 19.6.2006, 07:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



Там еще и комментарий неправильный, вводящий в заблуждение: TranslateMessage вовсе не транслирует акселераторы, это делает TranslateAccelerators.
Выкинь книгу. smile 

Когда ты сам посылаешь сообщение SendMessage, все зависит от того, кому: если окну того же потока, то программа (твой поток) в этот момент именно это и делает, т.е. посылает сообщение, потом обрабатывает его (сразу). Вызывающая функция ждет, когда сообщение будет обработано.

Использовать GetMessage вместо PeekMessage вовсе не более эффективно. GetMessage немного проще, но PeekMessage дает больший контроль. 


--------------------
...
PM   Вверх
takedo
Дата 19.6.2006, 07:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 501
Регистрация: 1.6.2005

Репутация: -1
Всего: 3



Bogdan1024, ты зря паришься. В виндовс в окне есть несколько очередей сообщений 1)PostMessage, 2)SendMessage. 2) имеет больший приоритет, чем 1). Ещ1 больший приоритет имеет SendNotifyMessage - тоже синхронное кстати сообщение smile , то есть грубо говоря у тебя аж целых 3 очереди с разным приоритетом. Ситуация когда SendMessage прерывает выполнение другой при наличии очередей практически невозможна(но чего только не бывает в жизни smile ). А лучше всего прочитай Рихтера. Там тебе весь цикл обработки сообщений показан как на ладони.  


--------------------
я не гольфист - я хоккеист
PM MAIL   Вверх
Earnest
Дата 19.6.2006, 08:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



takedo, не совсем прав: SenвMessage не ставится в очередь, а приводит к прямому вызову оконной процедуры. Даже если вызов из другого потока. Хотя в этом случае ждать, возможно, придется долго, и даже можно получить deadlock:
Цитата

If the specified window was created by the calling thread, the window procedure is called immediately as a subroutine. If the specified window was created by a different thread, the system switches to that thread and calls the appropriate window procedure.

Что касается SendNotifyMessage, то при вызове в рамках одного потока она неотличима от SendMessage, а вот при вызове из другого потока - возвращается немедленно. Однако это еще не значит, что сообщение будут немедленно обработано.
Цитата

The SendNotifyMessage function sends the specified message to a window or windows. If the window was created by the calling thread, SendNotifyMessage calls the window procedure for the window and does not return until the window procedure has processed the message. If the window was created by a different thread, SendNotifyMessage passes the message to the window procedure and returns immediately; it does not wait for the window procedure to finish processing the message.

Насчет рекомендации почитать Рихтера - присоединяюсь. 


--------------------
...
PM   Вверх
Bogdan1024
Дата 19.6.2006, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1436
Регистрация: 28.9.2005
Где: Киев

Репутация: нет
Всего: 13



Огромное спасибо всем, кто ответил в этом топике! Вы не поверите на сколько противоречивые ответы я получал по этому вопросу!
А что именно у Рихтера читать? 


--------------------
user posted image
PM MAIL   Вверх
0x07L
Дата 19.6.2006, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 10.6.2006
Где: Москва

Репутация: 4
Всего: 5



Цитата(Earnest @  19.6.2006,  07:05 Найти цитируемый пост)
Использовать GetMessage вместо PeekMessage вовсе не более эффективно. GetMessage немного проще, но PeekMessage дает больший контроль. 

Я где-то слышал, что GetMessage, если очередь сообщений пуста, ждет сообщения, а PeekMessage в таком случае сразу возвращает управление. 
PM MAIL   Вверх
Earnest
Дата 19.6.2006, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



Да, именно так. "Услышать" это можно в MSDN.
Используя PeekMessage, можно, например, организовать обработку on-idle. 


--------------------
...
PM   Вверх
0x07L
Дата 19.6.2006, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 10.6.2006
Где: Москва

Репутация: 4
Всего: 5



Вот это я и имел в виду, говоря про бОльшую эффективность GetMessage. Если очередь сообщений пуста, то при PeekMessage мы будем крутиться в цикле, напрасно тратя время (процессорное), а при GetMessage будем просто ждать, пока сообщение не придет. 
PM MAIL   Вверх
BreakPointMAN
Дата 19.6.2006, 22:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 15.9.2004
Где: Saratov

Репутация: нет
Всего: 24



Цитата(Bogdan1024 @  19.6.2006,  11:55 Найти цитируемый пост)
А что именно у Рихтера читать? 


"Windows для профессионалов: создание эффективных Win32 приложений с учетом специфики 64-разрядной версии Windows" © Джеффри Рихтер - главу 26, "Оконные сообщения". 


--------------------
"Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце")
PM WWW ICQ   Вверх
HappyLife
Дата 23.6.2006, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 642
Регистрация: 17.5.2006

Репутация: нет
Всего: 8



Цитата(0x07L @ 19.6.2006,  19:52)
Вот это я и имел в виду, говоря про бОльшую эффективность GetMessage. Если очередь сообщений пуста, то при PeekMessage мы будем крутиться в цикле, напрасно тратя время (процессорное), а при GetMessage будем просто ждать, пока сообщение не придет.

Мы все равно крутимся в цикле, но этот цикл расположен в самом внутреннем коде GetMessage 
PM MAIL   Вверх
maxim1000
Дата 23.6.2006, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 2
Всего: 110



Цитата(HappyLife @  23.6.2006,  14:04 Найти цитируемый пост)
Мы все равно крутимся в цикле, но этот цикл расположен в самом внутреннем коде GetMessage

если бы это было так, любая программа, использующая этот способ, стремилась бы занять всё свободное процессорное время, чтобы выполнить кучу инструкций типа jump 0

когда нет сообщений, вызов GetMessage приводит к остановке потока, а система уже решает, когда его продолжить (т.е. когда к нему придут сообщения)
скорее всего, используется что-то вроде механизма WaitForSingleObject и т.п. ... 


--------------------
qqq
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0598 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.