Пример ниже использует функцию 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); // распределяет сообщения окна } |