Апр 28 2010

Мультимедийный таймер

Для использования в вашем приложении мультимедийного таймера необходимо подключить к проекту мультимедийную библиотеку winmm.lib1 и добавить в начало файла, в котором вызываются функции библиотеки, следующую директиву:
finclude
Содержащаяся в библиотеке функция timeGetDevCaps позволяет узнать поддерживаемое системой разрешение мультимедийного таймера. Для этого определите переменную структурного типа
TIMECAPS tc: и вызовите функцию
timeGetDevCaps(&tc, sizeof(TIMECAPS));
В результате этого вызова поля tc.wPeriodMin и tc.wPeriodMax будут содержать минимальное и максимальное разрешения в миллисекундах, поддерживаемые для мультимедийного таймера. Для нашего компьютера, например, были получены значения 1 мс и 1 000 000 мс соответственно.
Мультимедийная библиотека содержит функции timeBeginPeriod и timeEndPeriod, предназначенные для установки и отмены конкретного разрешения мультимедийного таймера. Величина разрешения в миллисекундах передается в виде параметра в обеих функциях.
MSDN рекомендует вызывать функцию timeBeginPeriod(tc.wPeriodMin) непосредственно перед тем, как обратиться к сервису мультимедийного таймера. Повышенное разрешение таймера, по-видимому, реализуется в системе при помощи создания отдельного потока с высоким приоритетом выполнения. Поэтому рекомендуется отменять режим повышенного разрешения таймера (timeEndPeriod), как только он перестает быть нужным.
Ранее мы уже использовали функции timeBeginPeriod и timeEndPeriod для повышения точности работы функции Sleep. Степень влияния этих функций на работу собственно мультимедийного таймера мы выясним, когда проведем эксперименты с тестовой программой.


Апр 06 2010

Функции timeSetEvent и timeKillEvent

Мультимедийный таймер выполняется в своем собственном потоке. Он отслеживает заданный временной интервал и активизирует по истечении этого интервала таймерное событие. После этого Windows либо вызывает заданную функцию обратного вызова, либо устанавливает заданное событие.
Сервис мультимедийного таймера вызывается с помощью функции timeSet Event:
MMRESULT timeSetEventCUINT uDelay, UINT uResolution.LPTIMECALLBACK lpTimeProc,
DWORD dwUser, UINT fuEvent);
В параметре u Delay указывается задержка активизации таймерного события. В качестве единиц измерения используются миллисекунды. Если значение параметра выходит за пределы задержек, поддерживаемых таймером, то функция вернет код ошибки.
Параметр uResolution содержит разрешение таймерного события в миллисекундах. Чем меньше значение этого параметра, тем выше разрешение. Нулевое значение параметра означает, что периодические события таймера должны появляться с максимально возможной точностью. Однако чем выше разрешение, тем больше будут накладные расходы операционной системы, поэтому желательно выбирать максимальное значение параметра uResolution, при котором удовлетворяются потребности приложения.
Параметр lpTimeProc содержит адрес функции обратного вызова, которая вызывается после установки таймерного события. Если параметр fuEvent содержит флаг TIME_CALLBACK_EVENT_SET или TIME_CALLBACK_EVENT_PULSE, то параметр lpTimeProc интерпретируется как дескриптор объекта «событие».
Параметр dwUser может содержать данные, передаваемые в функцию lpTimeProc, интерпретация которых определяется программистом. В частности, эти данные иногда используются для организации обратной связи с вызывающей функцией.