Таймеры. Применение таймеров, страница 2

Таймеры реализуются с использованием концепции времени Windows. Время Windows (Windows time) измеряется в тактах системных часов и определяется числом этих тактов с момента запуска Windows. Это значение хранится в виде 32-разрядного целого числа без знака, которое сбрасывается в ноль после того, как Windows проработает более 49 дней. Хотя такое маловероятно, тем не менее, это событие может произойти, например, между двумя последовательными сообщениями WM_TIMER. Поэтому при сравнении двух промежутков времени необходимо проверять условие сброса системного времени в ноль, иначе может произойти прерывание программы.

К функциям, в которых используется время Windows, относятся GetTickCount и GetMessageTime. Так, функция GetTickCount возвращает текущее число тактов системных часов, а функция GetMessageTime — число тактов в момент создания данного сообщения, т.е. в момент его помещения в очередь сообщений.

Счетчики монитора производительности

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

Кроме того, сообщение WMJTIMER формируется системой только в том случае, если в очереди отсутствуют необработанные сообщения. Таким образом, все остальные сообщения обладают более высоким приоритетом, нежели WMJTIMER Единственным исключением из этого правила является сообщение WM_PAINT, при наличии которого приоритет отдается сообщениям таймера.

Отсутствие запуска таймеров в большинстве приложений не приводит к серьезным проблемам. Однако если требуется более точное измерение времени, для этого существует иной способ: счетчики монитора производительности. Счетчики монитора производительности представляют собой высокоточные таймеры, которые обеспечивают наиболее точное измерение времени в системе. Наличие счетчиков монитора производительности имеет решающее значение для обширного ряда приложений, в том числе для научных измерений, временной синхронизации музыкальных произведений, взаимодействия в играх и особенно для контроля производительности при выполнении программ.

Для определения возможностей счетчиков монитора производительности в Win32 API предоставляются две функции. Так, функция QueryPerformanceCounter позволяет получить текущее значение счетчика монитора производительности, а функция QueryPerformanceFrequency возвращает число приращений этого счетчика в секунду.

Описание функций таймеров

Все функции таймеров сведены в табл. 24.1, а их подробное описание следует после таблицы.

Таблица 24. 1. Сводка функций таймеров