Почему мой таймер перестает тикать? - PullRequest
5 голосов
/ 29 июня 2010

Я создаю приложение для рисования, которое отображает OpenGL, когда получает WM_SCROLL или WM_MOUSEMOVE. Дело в том, что движений мыши много, и мне нужно, чтобы она отображала максимум 60 кадров в секунду. Поэтому я создал bool в своем классе двигателей под названием CanRender. поэтому в моем render () proc я делаю: если (! CanRender) { вернуть; } CanRender = false;

В основном это предотвращает рендеринг более 60 кадров в секунду.

Я создаю таймер в WM_CREATE.

когда я получаю WM_TIMER, я устанавливаю CanRender в true.

Я издала звуковой сигнал, поэтому знаю, что таймер работает. Как только я начинаю прокручивать или перемещать мышь, звуковой сигнал прекращается, и я больше не вижу рендеринга. Почему это остановит мой таймер? Кроме того, когда я сворачиваю таймер, таймер запускается снова, а затем снова увеличивается, он снова останавливается.

Спасибо

Сообщение насоса:

// Main message loop:
while (GetMessage(&msg, NULL, 0, 0))
{
    if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

}

return (int) msg.wParam;

создание:

case WM_CREATE:
    //Set Window Title
    SetWindowText(hWnd,engineGL.current.caption.c_str());

    SetTimer(hWnd,             // handle to main window 
        120,                    // timer identifier 
        17,                     // 60 fps interval 
        (TIMERPROC) NULL);     // no timer callback 

1 Ответ

3 голосов
/ 29 июня 2010

Почему это так сложно?

Рисование в приложении Windows обычно выполняется только в сообщении WM_PAINT и запускается функцией RedrawWindow.Вы можете вызвать RedrawWindow в WM_SCROLL и WM_MOUSEMOVE.Многократные вызовы RedrawWindow (сообщения WM_PAINT) будут свернуты, если ваше приложение не сможет поспеть за рисованием.

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


По вашему вопросу ... Я думаю, что сообщений WM_SCROLL и WM_MOUSEMOVE много.И те не могут быть разрушены.Поэтому, если вы рисуете внутри них (что занимает много времени), вы блокируете свою очередь сообщений, и сообщения WM_TIMER не могут быть обработаны.Таким образом, вы не слышите гудки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...