Имхо основная разница в том, что GetMessage не возвращает управление программе пока не появится сообщение, а PeekMessage возвращает управление независимо от наличия или отсутствии сообщений в очереди. Поэтому если тебе нужно дождаться сообщения и нечем заняться во время простоя (idle) - используешь Get.., если же хочешь "поразвлечься" в свободное время, то Peek.. Типа того: "если PeekMessage, то ..., иначе Idle"
хочу предостеречь- многие примеры по OpenGL используют PeekMessage и рендеринг экрана в этом же цикле, так на Атлонах через 10-15 минут проц перегревается (не от рендеринга, а от 99% загрузки проца из-за цикла) и комп вырубается
Атлон здесь ничем не отличается от любого Интеловского камня. Цикл с Idle процессингом надо разбавлять вызовами Sleep, тогда поток не будет забирать слишком много процессорного времени. Вот пример упрощенного модального цикла: Код (Text): HWND hWnd = CreateWindowEx (dwExStyle, szClassName, szTitle, WS_BORDER|WS_VISIBLE|WS_SYSMENU, 0, 0, 100, 20, 0, 0, 0, NULL); BOOL fMsgLoop = TRUE; do { MSG msg; if (PeekMessage (&msg, hWnd, 0, 0, PM_REMOVE)) { TranslateMessage (&msg); DispatchMessage (&msg); } if ( !OnIdle () ) SleepEx (20, TRUE); } while (fMsgLoop);
Еще один стандартный вариант не гонять циклы - это использовать WaitMessage после OnIdle, т.е. отработали и отдали управление системе пока не появится новое сообщение.
_DEN_ Я серьезно- у компов с Атлоном и со штатным кулером (который в магазинах на собранные компы ставят) 99% загрузка сносит комп через 20 минут.
yureckor Епсель - попсель, один хрен проц выполняет те же 3 млрд тиков в секунду, находясь в ожидании (idle). Откуда такой бред?
_DEN_ ты бы поостерегся так говорить. тики тиками а нагрузка на исполнительные блоки сильно разная. Проверяется элементарно. Берешь термопару, цепляешь в район проца. Оставляешь комп в идел на минут 20, смотришь показания (на моем icel 1700 это в районе 37 C). потом пускаешь какуюнить прогу, например кодирование видео. Я пускал брутфорсер (неважно чего). И смотрим на данные - у меня за минут 6-8 температура камня подскакивает до 52 C и соотв. кулер разгоняется - это сразу слышно.
infern0 Блин, ну хрен знает, не верю я что атлоны через 20 минут "полной загрузки" выходят из сторя. Кто бы их тогда покупал??? И кстати, OpenGL тут не при чем, во время рендера CPU не напрягается.
Есть программы для разогрева ЦП (S&M, CPUburn, BurnK7), которые специально загружают его тяжелыми коммандами (вроде FDIV). На некоторых системах это даже приводит к вылету преобразователя на маме, или порче блока питания, за счет сильно возросшего тока потребления. Другое дело что во время простоя система отдает много квантов самому тихому потоку, а по Рихтеру он вроде нуликами забивает блоки свободной памяти. Операция записи в память процессор видимо сильно не нагружает. На системах с установленной и включенной программой охлаждения ЦП (вроде S2kCtl) вызываемые Windows команды hlt (в простое есстно) начинают приносить пользу - процессор засыпает на короткие промежутки времени и соответственно меньше потребляет энергии. Так что польза от простоя очевидна.
_DEN_>„хочу предостеречь- многие примеры по OpenGL используют PeekMessage“ OpenGL тут не при чем, во время рендера CPU не напрягается. См. на одно предложение ниже: проц перегревается (не от рендеринга, а от 99% загрузки проца... Вроде как напряжения питания и мощность потребления у разных блоков процессора различаются, так что и тепловыделение разное. А вообще хрен его знает. Но вечный цикл без Sleep'а- и тест готов. А температуру проца и так материнка показывает, да и на ощупь никто не отменял
yureckor > В топку такие примеры! Нужно рисовать в отдельном трэде с повышенным приоритетом и делать время от времени Sleep(1) (а перед этим вызвать timeBeginPeriod(1), иначе задержка будет совсем не 1ms), а не то при перемещении окна тормоза будут ещё те Тогда сообщения можно спокойно по GetMessage обрабатывать. _DEN_ > Тут не в атлонах дело, а в том, что на них часто драные кулеры ставят.
в WinNT System Idle Process занимается очисткой файла подкачки, AFAIK. Ага. А еще иногда про термопасту забывают
BOOL PeekMessage(LPMSG lpMsg,HWND hWnd,UINT wMsgFilterMin,UINT wMsgFilterMax,UINT wRemoveMsg); А почему бы не юзать фильтр сообщений для "защиты от перегрева"? з
cpp_and_wasm Не знаю как на C, а на масм Код (Text): msg_loop: invoke GetMessage, addr msg, [hwnd], 0, 0 or eax, eax je end_loop invoke DispatchMessage, addr msg jmp msg_loop end_loop: Х.з. что вытворяет, и это х.з. ещё и от windы зависит А invoke GetMessage, addr msg, 0, 0, 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% )))).