2012-06-16 2 views
0

Выполняет ли Sleep(sometime) цель в типичном контуре бесконечного окна, или это просто бесполезно или даже вредно?Сон() в цикле сообщений Windows?

Некоторые примеры содержат Sleep, большинство из них этого не делают.

// Main message loop: 
    MSG msg; 
    while (GetMessage(&msg, NULL, 0, 0)) 
    { 
     TranslateMessage(&msg); 
     DispatchMessage(&msg); 
     Sleep(500); // As pointed out below, completely nonsense 
     Sleep(5); // Would have been the better example, but still bad 
    } 

ответ

4

Этот звонок бессмыслен. GetMessage ждет, пока в очереди не появится сообщение, и, несмотря на это, ваша программа не будет обрабатывать CPU. Нет необходимости пытаться делать то, что он уже делает.

Теперь о вреде, может быть (очень наверняка) это будет! Если в очереди есть 1000 сообщений, он будет спать в течение 500 секунд, прежде чем сможет обработать их все. За это время вам будет накоплено гораздо больше 1000 сообщений. Это будет незадолго до того, как ваше окно станет совершенно бесполезным. Windows действительно получает много сообщений. Вы скажете мне, что вы будете ждать полсекунды, чтобы отвечать каждый раз, когда мышь перемещается на всех над вашим окном?

Кроме того, из documentation, GetMessage будет возвращен -1, если произошла ошибка. Поскольку -1 не равно 0, ваш цикл будет пытаться обработать сообщение в любом случае. Более правильный способ был бы либо поместить в обработчик, или выйти вообще:

while (GetMessage (&msg, NULL, 0, 0) > 0) 
+0

«Вы скажете мне, что вы будете ждать полсекунды, чтобы отвечать каждый раз, когда мышь перемещается по всему окну?» Нет, я просто спрашиваю ;-) Да, пример был глупым, но я нашел это в некотором коде. –

+2

@HorstWalter: Там нет недостатка в глупом коде. –

2

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

1

Windows работает, когда ваше приложение не работает. Вы даже не нуждаетесь в техническом об этом: Пример кода, который вы опубликовали, является эквивалентом представителя службы поддержки, спящего на задании, когда телефон звонит с крючка. Удалить Sleep().

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