Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Книга о KOL.doc
Скачиваний:
36
Добавлен:
30.04.2019
Размер:
1.77 Mб
Скачать

5.8. Мультимедийный таймер (tmmTimer)

Данный объект является более точным инструментом для отсчета интервалов времени, чем простой таймер. Он использует так называемый "мультимедийный" таймер, который для своей работы не требует оконного дескриптора, и вместо отправки сообщений, напрямую вызывает пользовательский обработчик. Причем, вызов происходит всегда в чужом (системном) потоке команд. Т.е. не только не гарантируется, что событие будет срабатывать только, когда процесс ожидает сообщений, но напротив: почти наверняка будет происходить прерывание текущей операции, чтобы выполнить указанный обработчик.

Иерархически TMMTimer происходит не от TObj, а унаследован от TTimer. Метод SetEnabled у объекта TObj является виртуальным, поэтому, в принципе, можно передавать объект TMMTimer в качестве параметра каких-либо процедур вместо TTimer.

Конструктор мультимедийного таймера:

NewMMTimer( i ) - возвращает указатель типа PMMTimer. В качестве интервала можно указать значения, меньшие, чем 50 миллисекунд (в том числе можно указать и минимально возможное значение 1 миллисекунда). Но точность этого таймера хотя и выше, но все еще не может быть беспредельной. Операционная система Windows не является системой реального времени. Даже соблюдение для такой разновидности таймера декларируемой точности (10 миллисекунд по умолчанию) не гарантируется, если вдруг системе показалось, что у нее есть более важные дела. Для повышения точности можно указать большее разрешение (т.е. уменьшить свойство Resolution), поднять приоритет своей задачи, или отказаться от использования Windows (шутка).

Свойства, методы, событие для TMMTimer - все те же, что и у его предка в иерархии TTimer. Добавляются еще два свойства:

Periodic - таймер является периодическим (по умолчанию это свойство сразу после создания объекта содержит true, т.е. таймер создается периодическим). Непериодический таймер отличается тем, что при срабатывании автоматически переходит в неактивное состояние, т.е. он «одноразовый»;

Resolution - точность мультимедийного таймера. Значение 0 (по умолчанию используется именно оно) означает абсолютную точность, но приводит к полной деградации производительности системы. Т.е. система больше не может ничем заняться, она в этом случае только считает время, и менеджер задач, если сможет работать, покажет только, что процессор загружен на 100%. Значение 10 является обычно приемлемым значением, и рекомендуется, по возможности, не использовать меньшие значения.

В общем зеркале MCK для простого и мультимедийного таймеров, TKOLTimer, специально для настройки мультимедийного таймера, есть свойства Periodic и Resolution. Свойство времени разработки Multimedia следует использовать для того, чтобы переключить таймер из обычного режима в мультимедийный, и обратно.

И пожалуйста, не забывайте, что обработчик мультимедийного таймера вызывается в собственном потоке команд, т.е. необходимо обеспечить защиту ресурсов и частей кода, которые не являются "повторно входимыми" (реентерабельными - старинное уже обозначение, которое даже успело прочно войти в технический язык до того, как спохватились поборники чистоты русской речи). В частности, нежелательно работать с оконными объектами, иначе как отправляя им сообщения путем постановки сообщений в очередь (метод TControl.Postmsg, или API-функция PostMessage). Более подробно о защите участков кода см. так же следующую главу (объект TThread).