Создание таймера


Пример ниже использует функцию SetTimer, чтобы создать два таймера. Первый таймер срабатывает каждые 10 секунд, второй - каждые 5 минут.

Демонстрационный пример

// Установим два таймера.
 
SetTimer(hwnd,             // дескриптор главного окна
    IDT_TIMER1,            // идентификатор таймера
    10000,                 // 10-секундный интервал
    (TIMERPROC) NULL);     // не вызвать обратно таймер
 
SetTimer(hwnd,             // дескриптор главного окна 
    IDT_TIMER2,            // идентификатор таймера 
    300000,                // пятиминутный интервал 
    (TIMERPROC) NULL);     // не вызвать обратно таймер
        

Чтобы обрабатывать сообщения WM_TIMER, создаваемые этими таймерами, в оконную процедуру для параметра hwnd добавим в оператор выбора (case-оператор) WM_TIMER.

Демонстрационный пример

case WM_TIMER:
 
    switch (wParam)
    { 
        case IDT_TIMER1:
            // обработаем 10-секундный таймер
 
             return 0;
 
        case IDT_TIMER2:
            // обработаем пятиминутный таймер

            return 0;
    } 

Прикладная программа также может создавать таймер, сообщения WM_TIMER которого обрабатываются не главной оконной процедурой, а определяемой программой функцией повторного вызова, как это в нижеследующем примере кода, который создает таймер и использует функцию повторного вызова MyTimerProc обрабатывающую сообщения WM_TIMER таймера.

// Установим таймер.
 
SetTimer(hwnd,                // дескриптор главного окна
    IDT_TIMER3,               // идентификатор таймера
    5000,                     // 5-секундный интервал
    (TIMERPROC) MyTimerProc); // обратный вызов таймера
     

Соглашение о вызове MyTimerProc должно быть основано на функции повторного вызова TimerProc.

Если ваша прикладная программа создает таймер без определения дескриптора окна, ваше приложение должно отслеживать в очереди сообщений сообщения WM_TIMER и распределять их в соответствующее окно.

Обратите внимание! на то, что функция GetMessage может возвратить (минус) -1, если имеется ошибка.

Демонстрационный пример

HWND hwndTimer;   // дескриптор окна для сообщений таймера
MSG msg;          // структура сообщений
 
    while (GetMessage(&msg, // структура сообщений 
            NULL,           // дескриптор окна, которое получает сообщение
            NULL,           // самое нижнее сообщение, которое проверяется
            NULL)           // самое верхнее сообщение, которое проверяется
           != 0 && GetMessage(&msg, NULL, NULL, NULL) != -1)
    { 
 
        // Пошлем сообщение WM_TIMER в параметре hwndTimer процедуры.
 
        if (msg.message == WM_TIMER)
        { 
            msg.hwnd = hwndTimer;
        } 
 
        TranslateMessage(&msg); // трансляция кодов виртуальных клавиш
        DispatchMessage(&msg);  // распределяет сообщения окна
    } 

 

Назад в оглавление
На главную страницу
Переведено 21.05.2007 22:37 ©Copyright V. Sokovikov
Hosted by uCoz