Таймеры
Часто возникает потребность в планировании периодически возникающего события, связанного с выполнением определенного программного кода. В текстовом редакторе такое событие может быть использовано для запуска команд сохранения файлов, в среде программирования — для обнаружения продолжительного времени простоя, которое может быть использовано для очистки динамически распределяемой памяти, а в режиме сохранения экрана — для запуска анимационной последовательности. Для выполнения подобного рода операций в интерфейсе Win32 API поддерживаются таймеры. Таймеры представляют собой регистрируемые события, которые запускаются через программируемые промежутки времени.
Таймеры назначаются из общего пула всех процессов в системе. В предыдущих версиях Windows существовали определенные ограничения на количество таймеров, которые исчезли в Windows NT/2000 и Windows 9.x. Так, в Windows 9.x моно создать более 2500 системных таймеров, а в Windows NT/2000 — более 10000 таймеров.
Применение таймеров
Функция SetTimer создает таймеры и устанавливает их параметры. Таймер можно распознать по связанному с ним окну и целому значению, которое является уникальным для данного окна. После создания таймер начинает генерировать события таймера вплоть до его удаления. При выходе из приложения таймеры автоматически освобождаются.
Период между событиями данного таймера известен под названием интервала запуска (firing interval). Несмотря на то что интервал запуска указывается в миллисекундах, точность задания интервала запуска таймера ограничивается точностью работы системных часов. Для получения более точного разрешения используются счетчики монитора производительности, которые поясняются далее в главе.
В листинге 24.1 показан код, необходимый для создания и применения таймера. Для того чтобы отличить этот таймер от других таймеров, в заданном окне используется уникальный идентификатор MYJTIMER (имеющий значение 1). Следует заметить, что идентификатор MY_TIMER указывается как при вызове функции для установки таймера, так и при обработке сообщения WM_TIMER, передаваемого классу данного окна. При этом окно hWnd получает сообщение WM_TIMER для таймера MY_TIMER каждую секунду.
Листинг 24.1. Применение таймера_______________________________
и. \local-sources\chap24\t24-01.txt
Еще одним примером применения таймеров может служить функция обратного вызова TIMERPROC, которая предоставляется в качестве последнего параметра функции
SetTimer. Вместо создания сообщений WM_TIMER в данном случае система непосредственно вызывает по каждому событию таймера функцию обратного вызова TIMERPROC, определенную в приложении.
В листинге 24.2 показано, каким образом используются обратные вызовы таймера. По сути дела, код обработки событий таймера в данном случае перемещен в функцию TIMERPROC, которая указывается при вызове функции SetTimer.
Листинг 24.2. Применение обратных вызовов таймера_____________________
м. \local-sources\chap24\t24-02.txt
Благодаря применению функций обратного вызова несколько упрощается процедура формирования и передачи сообщений классу окна. Кроме того, применение обратных вызовов таймеров позволяет в какой-то степени оптимизировать обработку, поскольку в данном случае система передает управление непосредственно в обратный вызов, а не требует от приложения определить код, который необходимо выполнить для таймера.
Функция SetTimer позволяет также изменять параметры таймера. Для видоизменения уже существующего таймера должен быть указан как дескриптор окна, так и идентификатор таймера. Как правило, это делается для изменения интервала запуска таймера, хотя функция SetTimer позволяет заменить таймер, ориентированный на сообщения, таймером обратного вызова, и наоборот.
Кроме того, функция SetTimer может автоматически сформировать следующий неиспользованный идентификатор таймера. Это значение возвращается функцией SetTimer в случае, когда при ее вызове в качестве идентификатора таймера передается NULL. Подобное свойство особенно полезно в случае, когда количество таймеров неизвестно.
Таймеры можно создавать в приложении и безо всяких связей с окном, если при вызове функции SetTimer в качестве дескриптора окна указывать NULL. Когда таймер, ориентированный на сообщения, устанавливается без связи с окном, приложение должно обрабатывать сообщения WMJTIMER из очереди в цикле PeekMessage-DispatchMessage, поскольку сообщения без дескриптора окна отправлять нельзя. С другой стороны, можно прибегнуть к таймерам обратного вызова, которым дескрипторы окон не требуются.
Функция KillTimer удаляет таймеры из системы. При выходе из приложения система автоматически освобождает все его таймеры, так что потребность в вызове функции KillTimer во время обработки выхода из приложения отпадает.
Время Windows
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.