Sleep () в цикле сообщений Windows?

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

В некоторых примерах есть 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
    }

person Horst Walter    schedule 16.06.2012    source источник


Ответы (3)


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

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

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

while (GetMessage (&msg, NULL, 0, 0) > 0)
person chris    schedule 16.06.2012
comment
Вы собираетесь сказать мне, что будете ждать полсекунды, чтобы ответить каждый раз, когда мышь перемещается по всему окну? Нет, я просто спрашиваю ;-) Да, пример глупый, но я нашел это в каком-то коде. - person Horst Walter; 16.06.2012

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

person shf301    schedule 16.06.2012

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

person Sage Gerard    schedule 16.06.2012