Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторный практикум «Основы разработки приложений Windows» книга 2.DOC
Скачиваний:
91
Добавлен:
10.05.2014
Размер:
827.9 Кб
Скачать

3. Таймеры Windows Организация и обслуживание таймеров

В прикладных задачах часто возникает необходимость времен­нόй синхронизации тех или иных процессов. Представим себе, например, что компьютер используется для управления экспериментальной или производственной установкой. Тогда одной из функций управляющей программы может быть периодическое переключение текущего режима работы установки – значений действующих в ней электрических или магнитных полей, давлений, температур и т. д. В других случаях может использоваться “однократная” временная синхронизация, когда установка включается, отрабатывает заданное время и выключается по истечении установ­лен­ного временного интервала. Если интервал времени необходимо выдержать с высокой точностью, то для его задания приходится использовать специальные аппаратные средства (автономные или связанные с компьютером) – измерители временных интервалов; если же высокой точности не требуется, то вполне можно воспользоваться машинным таймером. Непосредственный доступ к физическому машинному таймеру, как и к другим аппаратным средствам компьютера, в Windows запрещен, однако Windows предоставляет прикладному программисту функции, позволяющие установить в приложении требуемое количество программных таймеров, с помощью которых приложение может обеспечить временную синхронизацию и задание временных интервалов.

Приложение устанавливает, или активизирует таймер, вызывая функцию SetTimer().Эта функция имеет следующий прототип:

UINT SetTimer(

HWND hwnd,//Дескриптор окна, с которым связан этот таймер

UINT idTimer,//Идентификатор таймера

UINT uTimeout,//Период срабатывания таймера в миллисекундах

TIMERPROC tmprc//Прикладная функция обслуживания таймера

);

Через параметр hwndсистеме Windows передается дескриптор окна, для которого устанавливается данный таймер. Сама функцияSetTimer()может быть вызвана в любом месте программы, однако, указав дескрипторhwnd, мы связываем таймер с конкретным окном, в оконную функцию которого будут поступать сообщенияWM_TIMER.

Параметр idTimerопределяет номер, который мы присваиваем данному таймеру. При установке единственного таймера этот номер не имеет значения и на его месте можно указать 0, но при наличии нескольких таймеров (из которых один, например, генерирует периодические сигналы, а другой задает время измерения) номер, присвоенный таймеру, позволяет в дальнейшем определить, от какого именно таймера пришло данное сообщениеWM_TIMER.

Параметр uTimeoutзадает период срабатывания данного таймера. Таймер после установки начинает периодически с интерваломuTimeoutгенерировать сообщенияWM_TIMER, поступающие в окноhwnd. Этот временнόй интервал задается в миллисекундах, что, строго говоря, не имеет смысла, так как период отсчета времени программным таймером имеет величину около 50 мс.

Последний параметр, tmprc, дает возможность организовать обслуживание таймера несколько иначе. Параметр представляет собой имяCALLBACK-функции, которая должна быть определена в программе и содержать процедуру прикладной обработки прерываний от таймера. Если этот параметр указан, то при каждом срабатывании таймера система Windows будет непосредственно, в обход оконной функции, вызывать функциюtmprc(). Такой способ установки таймера можно использовать, например, в тех случаях, когда в приложении отсутствует главное окно, что, впрочем, не типично для приложений Windows. Если сообщения от таймера предполагается обрабатывать обычным образом, посредством оконной функции, то на месте последнего параметра функцииSetTimer()указываетсяNULL.

Функция SetTimer()в случае своего успешного выполнения (нормальной установки таймера) возвращает номер данного таймера, т. е. фактически значение второго параметра.

Как уже отмечалось, таймер после своей установки начинает периодически генерировать сообщения с заданным интервалом; если таймер надо остановить, используется функция KillTimer()с дескриптором окна и номером таймера в качестве параметров. В частности, можно остановить таймер в прикладной функции обработки его сообщения. В этом случае мы получим режим задания однократного временнόго интервала.

Приведем в качестве примера скелетную схему программы, в которой требуется в течение заданного времени периодически выводить на экран некоторую информацию. Нас будут интересовать три прикладные функции: OnCreate(), в которой устанавливается таймер,OnTimer(), где периодически выполняются некоторые содержательные действия, например, чтение из установки текущего измеряемого значения, иOnPaint(), где это значение выводится в главное окно приложения. Поскольку эти функции будут вызываться в ответ на сообщенияWM_CREATE,WM_TIMERиWM_PAINT, в составе оконной функции главного окна должны в этом случае присутствовать макросыHANDLE_MSG, соответствующие этим сообщениям.

//Глобальные переменные

inttimeout=60;//60 замеров по 2с, всего 2 мин

intdata//Переменная для получения измерительных данных

BOOL OnCreate(HWND hwnd, LPCREATESTRUCT){

SetTimer(hwnd,1,2000,NULL)//Таймер №1, период 2с

}

void OnTimer (HWND hwnd,UINT){

... //Формирование очередного данного в переменной data

InvalidateRect(hwnd,NULL,TRUE);//Инициирование WM_PAINT

timeout--;//Отсчитываем число замеров

if(!timeout) //Если timeout = 0

KillTimer(hwnd,1)//уничтожим таймер №1

}

void OnPaint(HWND hwnd){

... //Вывод в главное окно данного data

}