Листинг 7.13.
Процедура, вызываемая при срабатывании таймера
procedure TimerProc(uTimerID, uMessage: UINT; dwUser, dw1, dw2:
DWORD) stdcall;
begin
//Добавляем текущее значение времени в список (чтобы была
//видна разница между моментами вызова этой процедуры)
Form1.lstTimes.Items.Add(IntToStr(timeGetTime()));
end;
Естественно, действия, выполняемые процедурой TimerProc, могут быть самыми различными. В нашем случае происходит заполнение списка (List) значениями счетчика «тиков» таймера на момент вызова процедуры (рис. 7.5).
Рис. 7.5. Результат работы таймера
В завершение вновь обратимся к функции timeSetEvent: кратко перечислим предоставляемые ею возможности, которыми мы не воспользовались в приведенном выше примере.
Как вы могли заметить, последний параметр функции timeSetEvent является битовой маской. Флаги этой маски задают два аспекта поведения таймера: количество срабатываний таймера и тип действия, которое требуется выполнять при срабатывании таймера.
Количество срабатываний таймера определяется двумя значениями.
• TIME_ONESHOT – таймер срабатывает один раз. Для таких таймеров вызывать timeKillEvent после срабатывания не нужно.
• TIME_PERIODIC – таймер срабатывает периодически через заданные промежутки времени.
Тип действия, выполняемого таймером, задается при помощи следующих констант:
• TIME_CALLBACK_FUNCTION – при срабатывании таймера вызывается процедура, адрес которой был передан третьим параметром;
• TIME_CALLBACK_EVENT_SET – вызывает SetEvent для объекта синхронизации «событие», дескриптор которого передан третьим параметром;
• TIME_CALLBACK_EVENT_PULSE – вызывается PulseEvent для объекта синхронизации «событие», дескриптор которого передан третьим параметром.
К сожалению, использование объектов синхронизации хоть и является темой для интересного разговора, но все же выходит за рамки этой главы. Потому, упомянув о соответствующих возможностях таймера, больше не будем распространяться на эту тему.