Как использовать таймеры в Windows - PullRequest
1 голос
/ 21 апреля 2009

Какие существуют способы настройки таймера с помощью Windows API. Каковы плюсы и минусы каждого метода?

Я использую C ++ MS DevStudio.

Ответы [ 4 ]

3 голосов
/ 21 апреля 2009

В системе Windows есть две функции, связанные с таймером: SetTimer и KillTimer (я знаю, имена нечетные - CreateTimer и DestroyTimer были бы более разумными, как в CreateWindow и DestroyWindow, но это то, что доступно).

SetTimer может функционировать в одном из двух режимов: событие таймера может инициировать определенный пользователем обратный вызов или может отправить сообщение в окно. Формат этой функции:

timer_id = SetTimer (window, event_id, interval, callback);

Чтобы использовать обратный вызов:

timer_id = SetTimer (NULL, NULL, interval_in_milliseconds, callback);

Чтобы получить сообщение WM_TIMER в окно:

timer_id = SetTimer (window, event_id, interval_in_milliseconds, NULL);

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

В зависимости от используемой ОС значение интервала имеет верхнюю и нижнюю границы. Подробнее см. Документацию API .

Чтобы освободить таймер после того, как вы закончили с ним, сделайте следующее, если вы указали дескриптор окна:

KillTimer (window, event_id); // event_id is important!

и если вы использовали обратный вызов:

KillTimer (NULL, timer_id);

С одним окном может быть связано много таймеров, используйте разные event_id для каждого таймера. Повторное использование event_id останавливает первый экземпляр таймера без отправки сообщения WM_TIMER.

Плюсы: довольно прост в использовании. Минусы: задержка между окончанием интервала и обработкой сообщения WM_TIMER, разрешение большое, требуется цикл обработки сообщений.

1 голос
/ 21 апреля 2009

Другой метод обработки таймеров - использование ожидаемых объектов таймера. Они не требуют обработки сообщений, не используют WM_TIMER или обратные вызовы. Таким образом, они немного сложнее. Понимание системы событий Windows будет полезно.

Существует три типа объектов таймера: ручной сброс, синхронизация и периодичность; и есть четыре функции для обработки объектов таймера: CreateWaitableTimer, SetWaitableTimer, CancelWaitableTimer и CloseHandle (есть пятая, OpenWaitableTimer, но она вряд ли будет полезна для многих людей). Существует также набор функций, необходимых для уведомления о том, когда истекает таймер: наиболее полезными являются WaitForSingleObject, MsgWaitForSingleObject, WaitForMultipleObjects и MsgWaitForMultipleObjects.

Обычный метод использования этих таймеров:

CreateWaitableTimer (...)
SetWaitableTimer (...)
WaitForSingleObject (...)
CloseHandle (...)

Сравните это с SetTimer - единственный способ узнать, истек ли таймер, - опросить его либо в цикле, либо с бесконечным таймаутом (то есть приостановить поток, пока не истечет таймер).

Плюсы: очень гибкий, нет необходимости иметь очередь сообщений. Минусы: трудно использовать

0 голосов
/ 22 апреля 2009

Для таймеров с высоким разрешением используйте queryperformancecounter

0 голосов
/ 21 апреля 2009

Обычно смотрите на API, который вы собираетесь использовать, например, MFC, Qt или GTK; все они имеют классы таймера.

Если вы не собираетесь использовать GUI API, мне лично нравится boost :: timer (www.boost.org)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...