GetMessage versus PeekMessage

Тема в разделе "WASM.WIN32", создана пользователем dr_dred, 7 июн 2005.

  1. dr_dred

    dr_dred Сергей

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    301
    Адрес:
    Russia
    Подскажите, когда удобно/нужно/необходимо использовать PeekMessage, а когда GetMessage?
     
  2. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Имхо основная разница в том, что GetMessage не возвращает управление программе пока не появится сообщение, а PeekMessage возвращает управление независимо от наличия или отсутствии сообщений в очереди. Поэтому если тебе нужно дождаться сообщения и нечем заняться во время простоя (idle) - используешь Get.., если же хочешь "поразвлечься" в свободное время, то Peek..

    Типа того: "если PeekMessage, то ..., иначе Idle"
     
  3. yureckor

    yureckor New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    494
    Адрес:
    Russia
    хочу предостеречь- многие примеры по OpenGL используют PeekMessage и рендеринг экрана в этом же цикле, так на Атлонах через 10-15 минут проц перегревается (не от рендеринга, а от 99% загрузки проца из-за цикла) и комп вырубается :)
     
  4. dr_dred

    dr_dred Сергей

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    301
    Адрес:
    Russia
    yureckor

    Хорошо, что у меня не Атлон. Прцессор грузится процента на три.



    leo

    Все понял. Спасибо.
     
  5. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    Атлон здесь ничем не отличается от любого Интеловского камня. Цикл с Idle процессингом надо разбавлять вызовами Sleep, тогда поток не будет забирать слишком много процессорного времени. Вот пример упрощенного модального цикла:
    Код (Text):
    1.  
    2.     HWND hWnd = CreateWindowEx (dwExStyle, szClassName, szTitle, WS_BORDER|WS_VISIBLE|WS_SYSMENU,
    3.                                     0, 0, 100, 20, 0, 0, 0, NULL);
    4.     BOOL fMsgLoop = TRUE;
    5.     do
    6.     {
    7.         MSG msg;
    8.         if (PeekMessage (&msg, hWnd, 0, 0, PM_REMOVE))
    9.         {
    10.             TranslateMessage (&msg);
    11.             DispatchMessage (&msg);
    12.         }                          
    13.         if ( !OnIdle () ) SleepEx (20, TRUE);
    14.     } while (fMsgLoop);
    15.  
     
  6. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Еще один стандартный вариант не гонять циклы - это использовать WaitMessage после OnIdle, т.е. отработали и отдали управление системе пока не появится новое сообщение.
     
  7. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    yureckor





    Для таких высказываний есть топик "Улыбнитесь! :)"
     
  8. yureckor

    yureckor New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    494
    Адрес:
    Russia
    _DEN_

    Я серьезно- у компов с Атлоном и со штатным кулером (который в магазинах на собранные компы ставят) 99% загрузка сносит комп через 20 минут.
     
  9. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    yureckor



    Епсель - попсель, один хрен проц выполняет те же 3 млрд тиков в секунду, находясь в ожидании (idle). Откуда такой бред?
     
  10. infern0

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia
    _DEN_

    ты бы поостерегся так говорить. тики тиками а нагрузка на исполнительные блоки сильно разная. Проверяется элементарно. Берешь термопару, цепляешь в район проца. Оставляешь комп в идел на минут 20, смотришь показания (на моем icel 1700 это в районе 37 C). потом пускаешь какуюнить прогу, например кодирование видео. Я пускал брутфорсер (неважно чего). И смотрим на данные - у меня за минут 6-8 температура камня подскакивает до 52 C и соотв. кулер разгоняется - это сразу слышно.
     
  11. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    infern0



    Блин, ну хрен знает, не верю я что атлоны через 20 минут "полной загрузки" выходят из сторя. Кто бы их тогда покупал???



    И кстати,







    OpenGL тут не при чем, во время рендера CPU не напрягается.
     
  12. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    Есть программы для разогрева ЦП (S&M, CPUburn, BurnK7), которые специально загружают его тяжелыми коммандами (вроде FDIV). На некоторых системах это даже приводит к вылету преобразователя на маме, или порче блока питания, за счет сильно возросшего тока потребления. Другое дело что во время простоя система отдает много квантов самому тихому потоку, а по Рихтеру он вроде нуликами забивает блоки свободной памяти. Операция записи в память процессор видимо сильно не нагружает. На системах с установленной и включенной программой охлаждения ЦП (вроде S2kCtl) вызываемые Windows команды hlt (в простое есстно) начинают приносить пользу - процессор засыпает на короткие промежутки времени и соответственно меньше потребляет энергии. Так что польза от простоя очевидна.
     
  13. yureckor

    yureckor New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    494
    Адрес:
    Russia
    _DEN_>„хочу предостеречь- многие примеры по OpenGL используют PeekMessage“ OpenGL тут не при чем, во время рендера CPU не напрягается.

    См. на одно предложение ниже: проц перегревается (не от рендеринга, а от 99% загрузки проца...

    Вроде как напряжения питания и мощность потребления у разных блоков процессора различаются, так что и тепловыделение разное.

    А вообще хрен его знает. Но вечный цикл без Sleep'а- и тест готов. А температуру проца и так материнка показывает, да и на ощупь никто не отменял :)
     
  14. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    yureckor >




    В топку такие примеры! :) Нужно рисовать в отдельном трэде с повышенным приоритетом и делать время от времени Sleep(1) (а перед этим вызвать timeBeginPeriod(1), иначе задержка будет совсем не 1ms), а не то при перемещении окна тормоза будут ещё те :derisive: Тогда сообщения можно спокойно по GetMessage обрабатывать.





    _DEN_ >




    Тут не в атлонах дело, а в том, что на них часто драные кулеры ставят.
     
  15. flankerx

    flankerx New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2004
    Сообщения:
    423
    Адрес:
    Moscow, Russia




    в WinNT System Idle Process занимается очисткой файла подкачки, AFAIK.





    Ага. А еще иногда про термопасту забывают :)
     
  16. Pushkoff

    Pushkoff New Member

    Публикаций:
    0
    Регистрация:
    12 сен 2005
    Сообщения:
    40
    Адрес:
    Донецк
    Интересно, что делают атлоны когда их видео жать заставляют, или архиватором нагружают???...
     
  17. cpp_and_wasm

    cpp_and_wasm Владимир

    Публикаций:
    0
    Регистрация:
    27 июл 2006
    Сообщения:
    128
    BOOL PeekMessage(LPMSG lpMsg,HWND hWnd,UINT wMsgFilterMin,UINT wMsgFilterMax,UINT wRemoveMsg);
    А почему бы не юзать фильтр сообщений для "защиты от перегрева"? :)з
     
  18. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    cpp_and_wasm
    Не знаю как на C, а на масм
    Код (Text):
    1. msg_loop:
    2.     invoke GetMessage, addr msg, [hwnd], 0, 0
    3.       or eax, eax
    4.       je end_loop
    5.     invoke DispatchMessage, addr msg
    6.   jmp msg_loop
    7. end_loop:
    Х.з. что вытворяет, и это х.з. ещё и от windы зависит :)
    А
    invoke GetMessage, addr msg, 0, 0, 0
    нормально пашет - похоже дело в том что когда окно указано явно, то какие то сообщения дочерним контролам не доходят ;)
     
  19. Guest

    Guest Guest

    Публикаций:
    0
    ЭЭЭ. Вы че вообще говорите? Атлоны перегреваются и валят комп за 15 минут :) Всю жизнь с Атлоном (2600+ Barton на данный момент), всегда в игрухах настройки по максиму, проц на 90% загружен, температура 70 упроца, у видяхи - 68 и 2 часа при этом вообще не проблема, фильмы перегоняю из DVD в AVI за 30-40 минут (DivX, Xvid в высоком качестве) при этом работает VS 8.0 и проблем нет. Всех кого знаю у них Атлоны, есть и с Атлоном 3600+ и штатными кулером - вообще проблем нет. Насчет того что в Айдл он жрет стоко-же что и при 100% - не совсем правда, т.к. всем известно что при нагрузке потребляемая мощность резко повышается в несколько раз, КПД у проца не ниже 60%, поэтому 40% потребляемого тока переходит в тепло, но оно отводится без проблем, нужно просто доп. охлаждение системника (как у Intel так и AMD) - вряд ли Intel повысили КПД до 100% :))))).