Академический Документы
Профессиональный Документы
Культура Документы
ЛЕКЦИЯ 14
ТАЙМЕР ________________________________________________________________________________ 1
Создание таймера ______________________________________________________________________ 1
Остановка таймера _____________________________________________________________________ 1
Пример использования таймера___________________________________________________________ 2
Тестирование работы таймера ____________________________________________________________ 3
ТАЙМЕР
Создание таймера
Для создания системного таймера оконный класс может использовать функцию-член SetTimer ( )
класса CWnd со следующим прототипом:
UINT SetTimer ( UINT nIDEvent , UINT nElapse ,
void ( CALLBACK EXPORT* lpfnTimer ) (HWND , UINT , UINT , DWORD )) ;
Эта функция возвращает идентификатор таймера, если она выполнена успешно, и ноль противном
случае. Параметры:
nIDEvent идентификатор таймера;
nElapse задает время срабатывания таймера в миллисекундах;
lpfnTimer указатель на callback-функцию, которая обрабатывает сообщения WM_TIMER. Если
этот параметр равен NULL, сообщения WM_TIMER помещаются в очередь сообще-
ний приложения и обрабатываются оконным объектом.
По истечении времени в nElapse миллисекунд после установки таймера или предыдущего его сраба-
тывания система посылает сообщение WM_TIMER в очередь приложения или передает его для обра-
ботки функции, на которую указывает параметр IpfnTimer. Прототип функции, на которую ссылается этот
указатель, должен быть следующим:
void CALLBACK EXPORT
TimerProc ( HWND hWnd , UINT nMsg , UINT nIDEvent , DWORD dwTime ) ;
Здесь
hWnd дескриптор оконного объекта, который вызвал функцию SetTimer ( ),
nMsg идентификатор сообщения WM_TIMER,
nIDEvent идентификатор таймера;
dwTime системное время.
Имя этой функции не обязательно должно быть TimerProc, однако она должна возвращать 0.
Остановка таймера
Остановить установленный таймер можно с помощью функции-члена того же класса KillTimer ( ) со
следующим прототипом:
BOOL KillTimer ( int nIDEvent ) ;
В качестве параметра nIDEvent этой функции передается идентификатор таймера. Функция возвра-
щает TRUE, если таймер остановлен, и FALSE – если нет.
При размещении указанных функций в программе следует иметь в виду, что эти функции в конечном
итоге вызывают функции Windows, каким передается в качестве параметра дескриптор окна, с которым
связывается таймер. Это означает, что установка таймера не может быть произведена раньше, чем будет
создано окно. Наиболее ранней в смысле выполнения программы точкой для установки таймера является
обработчик события OnNcCreate ( ). Уничтожение таймера также должно производиться, когда окно еще
существует. Последней возможностью для вас в этом смысле является обработчик события
OnNcDestroy ( ) (но до вызова обработчика базового класса). Мы рекомендуем вам всегда делать это не-
сколько раньше – в обработчике события OnClose ( ) или OnDestroy ( ).
Обработчик событий таймера называется OnTimer ( ) и имеет прототип:
afx_msg void OnTimer (UINT nIDEvent ) ;
Его единственный параметр nIDEvent задает идентификатор таймера. Эта функция вызывается опе-
рационной системой, чтобы позволить вашему приложению обработать сообщение Windows
WM_TIMER. Параметр, передаваемый функции, отражает значение. которое он имел в момент получе-
ния его функцией окна приложения. Если вы вызовете в этом обработчике обработчик базового класса,
Вид диалогового окна после 100 секунд работы показан на рисунке. Нетрудно видеть, что значения
счётчиков лишь приблизительно соответствуют системному времени.
Если мы уменьшим интервал срабатывания таймеров, то разница будет ещё больше. Несмотря на то,
что время срабатывания первого таймера установлено равным 1 мс, его реальное значение составило
16 мс.
Такое расхождение связано с тем, что операционная система посылает сообщение WM_TIMER в
очередь приложения и эта очередь не может продвигаться быстрее, чем происходит опрос внешних уст-
ройств.