Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабы по МП / API / Methods.doc
Скачиваний:
42
Добавлен:
11.05.2015
Размер:
233.47 Кб
Скачать

1.15.4 Таймеры пользователя

В данном разделе будет рассмотрена работа с таймерами пользователя. Эти таймеру доступны в том потоке, в котором они созданы. В ^тао^з имеются также таймеры другого типа — таймеры ожидания. Они доступны из любых потоков и процессов. Об этих таймерах см. в разд. 3.6.

Таймер пользователя создается функцией SetTimer:

UINT_PTR WINAPI SetTimer(IN HWND hWnd, IN UINT_PTR nIDEvent,

IN UINT uElapse, IN TIMERPROC lpTimerFunc);

Параметр hWndуказывает дескриптор окна, владеющего тем.потоком, из которого вызывается функция. Это параметр может быть задан равнымNULL. тогда параметрnIDEventэтой функции игнорируется. Если же параметрhWndзадан, то параметрnIDEventопределяет произвольный ненулевой идентификатор таймера. Этот идентификатор далее позволяет отличить один таймер от другoго.

Параметр uElapseзадает период срабатывания таймера в миллисекундах.

Параметр lpTimerFuncможет указывать на функцию обратного вызова или равнятьсяNULL. При значенииNULL. таймер по истечении заданного отрезка времени посылает тому потоку, в котором он был создан, сообщениеWM_TIMER. Значит, в потоке должна быть организована обработка этого сообщения. Если жеlpTimerFuncуказывает функцию обратного вызова, то таймер вызывает в соответствующий момент эту функцию. Тип этой функции в вызовеSetTimerдолжен быть явным образом приведен к типуFARPROC.

Функция обратного вызова имеет тип TIMERPROC:

VOID CALLBACK TimerProc(HWND hwnd, UINT UMsg, UINT idEvent, DWORD dwTime);

Параметр hwndопределяет окно, связанное с таймером, параметрuMsgуказывает сообщениеWM_TIMER. ПараметрidEventявляется идентификатором таймера. ПараметрdwTimeуказывает число миллисекунд, прошедших с момента стартаWindows. Это та величина, которая может быть получена вызовом функцииGetTickCount.

Функция SetTimerвозвращает идентификатор таймера. Если параметрhWndв ее вызове не равнялсяNULL, то этот идентификатор совпадает с заданным параметромnIDEvent.

Мы рассмотрели установку таймера. Он будет срабатывать с периодом, заданным параметром uElapseв вызове функцииSetTimer. Если требуется прервать работу таймера, следует удалить его функциейKillTimer:

BOOL KillTimer(HWND hWnd, UINT uIDEvent);

Параметр hWndуказывает окно и должен совпадать с аналогичным параметром функцииSetTimer, создавшей этот таймер. ПараметрuIDEventуказывает идентификатор удаляемого таймера.

Постройте тестовый пример, если хотите попробовать работать с таймерами. Пусть его форма будет содержать две кнопки и две метки. Щелчок на первой кнопке должен запускать таймер со временем выдержки 5 секунд. Таймер должен срабатывать один раз, и по истечении времени выдержки вывести сообщение об этом в первую метку. Щелчок на второй кнопке должен запускать таймер со временем выдержки 1 секунда. Таймер должен сработать 10 раз, выводя сообщение об истекшем времени во вторую метку. Реализация подобного приложения может иметь вид:

Int N = 0;

//--------------------------------

VOID CALLBACK Timer1(HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime)

{

if(idEvent == 1)

{

KillTimer(hwnd, idEvent);

Form1->Label1->Caption = “Сработал таймер ” + IntToStr(idEvent);

}

else

Form1->Label2->Caption = ++N;

if(N == 10)

{

Form1->Label2->Caption= “работа таймера 2 завершена”;

KillTimer(hwnd, idEvent);

}

}

}

//--------------------------------

void __fastcall TForm1::Button1Click(TObject *sender)

{

SetTimer(Handle, 1, 5000, (FARPROC)Timer1);

}

//---------------------------------

void __fastcall TForm1::Button2Click(TObject *sender)

{

SetTimer(Handle, 2, 1000, (FARPROC)Timer1);

}

Обработчики щелчков на кнопках создают таймеры с идентификаторами 1 и 2. Для обоих таймеров указана одна функция обратного вызова Timer1. В этой функции анализируется идентификатор таймера — рараметрidEvent. Первый таймер уничтожается функциейKillTimerпри первом же срабатывании — первом обращении к функцииTimer1. Второй таймер отсчитывает 10 обращений с помощью глобальной переменной N. и уничтожается на десятом срабатывании.

Отмечу, что, как вы знаете, в С++Builderимеется компонентTimer, который инкапсулирует характеристики таймера APIWindows. Так что, конечно, можно работать с ним, а можно непосредственно использовать описанные функции. Что проще — сказать трудно. Мне кажется, что во многих случаях все-таки проще непосредственно обращаться к функциям.

Завершая рассмотрение таймеров, необходимо напомнить об очеяь мощных таййерах ожидания, рассмотренных в разд. 3.6 Конечно, онжейоакнее рассмотренных в данном разделе. Но и возможности их намного шире.

Соседние файлы в папке API