Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции-ТРПС.doc
Скачиваний:
13
Добавлен:
15.11.2018
Размер:
810.5 Кб
Скачать

7.7.1. Использование таймера. Первый способ

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

#define TIMER_SEC 1 #define TIMER_MIN 2

//. . . . .

SetTimer(hWnd, TIMER_SEC, 1000, NULL); SetTimer(hWnd, TIMER_MIN, 60000, NULL);

Первый параметр функции SetTimer() – это дескриптор того окна, чья оконная процедура будет получать сообщения WM_TIMER. Вторым параметром является идентификатор таймера. Его значение должно быть больше нуля. Третий параметр – это 32-х разрядное беззнаковое целое, которое задает интервал в миллисекундах. Например, значение 1000 задает генерацию сообщений WM_TIMER один раз в секунду.

Когда оконная процедура получает сообщение WM_TIMER, значение wParam равно значению идентификатора таймера, а lParam для данного случая NULL.

Значение параметра wParam позволяют отличать передаваемые в оконную процедуру сообщения WM_TIMER от разных таймеров. Логика обработки сообщения WM_TIMER выглядит примерно так:

case WM_TIMER: KillTimer(hWnd, wParam); // остановить таймер switch(wParam) { case TIMER_SEC: // раз в секунду // ваши действия ... // вновь запускает таймер SetTimer(hWnd, TIMER_SEC, 1000, NULL); break;

case TIMER_MIN: // один раз в минуту // ваши действия ... // вновь запускает таймер SetTimer(hWnd, TIMER_MIN, 60000, NULL); break; }

return 0;

Для того, чтобы установить новое время срабатывания для существующего таймера, следует сначала его остановить функцией KillTimer() и вновь запустить при помощи SetTimer().

7.7.2. Использование таймера. Второй способ

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

Функция, которая будет получать эти таймерные сообщения должна быть функцией обратного вызова (CALLBACK). Эта функция приложения, которую, как и оконную процедуру, вызывает Windows. Приложение должно сообщить Windows адрес этой функции, а позже Windows вызывает именно ее, а не оконная процедуру. Как и оконная процедура, функция обратного вызова должна определяться как CALLBACK, поскольку Windows вызывает ее вне кодового пространства программы.

В случае функции обратного вызова для таймера, входными параметрами являются те же параметры, что и параметры оконной процедуры. Однако таймерная функция обратного вызова не имеет возвращаемого в Windows значения.

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

void CALLBACK TimerProc(HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime) { KillTimer(hWnd, idEvent); // остановить таймер if (idEvent == TIMER_SEC) { // раз в секунду // ваши действия ... // вновь запускает таймер SetTimer(hWnd, TIMER_SEC, 1000, TimerProc); } }

Первый параметр для TimerProc() – дескриптор окна, задаваемый при вызове функции SetTimer(). Поскольку Windows будет посылать функции TimerProc() только сообщения WM_TIMER, следовательно, параметр uMsg всегда равен WM_TIMER. Значение idEvent – идентификатор таймера, а значение dwTime – системное время.

При использовании функции обратного вызова для обработки сообщений WM_TIMER, четвертый параметр функции SetTimer() должен быть адресом функции обратного вызова:

SetTimer(hWnd, TIMER_SEC, 1000, TimerProc);

Второй способ обычно применяется, чтобы разгрузить оконную функцию. На первый взгляд получение значения системного времени тоже относится к преимуществам второго способа. Однако обращение к Win32 API функции

GetSystemTime (SYSTEMTIME* lpSystemTime)

позволяет решить эту задачу в произвольном месте вашего приложения.