Шаг 32 - Использование Таймера

Создание проекта

Продолжаем развивать наш проект.

Создаем код

Добавляем идентификатор таймера в заголовочный файл диалогового окна.

// diaDlg.h : header file
//

#if !defined(AFX_DIADLG_H__EBFF09CD_7067_11D5_B617_89F1B6D3EB46__INCLUDED_)
#define AFX_DIADLG_H__EBFF09CD_7067_11D5_B617_89F1B6D3EB46__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#define ID_TIMER_1 100
/////////////////////////////////////////////////////////////////////////////
// CDiaDlg dialog

В объявлении класса окна диалога добавляем функцию и переменную.

class CDiaDlg : public CDialog
{
............
// Implementation
afx_msg void OnTimer(UINT); // функция реакции на таймер
bool Test; // установка удаление таймера

protected:
............
};

В таблице откликов диалога.

BEGIN_MESSAGE_MAP(CDiaDlg, CDialog)
..........
//}}AFX_MSG_MAP
ON_WM_TIMER() // реагировать на таймер
END_MESSAGE_MAP()

Реализация функции в ответ на таймер.

void CDiaDlg::OnTimer( UINT uTime)
{
m_List.AddString("Timer !");
}

Реализация функции при нажатия на кнопку.

void CDiaDlg::OnButton1() 
{
if (!Test) // если таймер не установлен
{
Test=true; // установить его (логически)
SetTimer(ID_TIMER_1,1000,NULL); // а теперь физически
}
else // а иначе (установлен)
{
Test=false; // убить логически
KillTimer(ID_TIMER_1); // физически
}
}

Изменяем конструктор диалогового окна.

CDiaDlg::CDiaDlg(CWnd* pParent /*=NULL*/)
: CDialog(CDiaDlg::IDD, pParent)
{
..........
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
Test=false; // таймер не установлен
}

Вот такой результат Вы должны получит в результате сборки и запуска программы.

32_1.gif (10420 b)

Описание

Таймер позволяет синхронизировать процессы с реальным временем. Работает он так - после запуска таймера, через указанный интервал, вызывается процедура внутри которой и происходит анализ, реакция или подсчет вызовов.

Первым делом в файле заголовка ресурсов мы объявили идентификатор таймера. Таймеров в программе может быть несколько с разными интервалами, а событие вызова таймера одно. Так вот, при его вызове передается таймер, который сработал.

Далее в классе диалогового окна мы объявили функцию реакции. Её имя и параметры оговорены заранее, так как она виртуальная afx_msg. Как найти функцию соответствующую событию ? Наведите курсор на событие, а в нашем случае ON_WM_TIMER() и нажмите F1.

ON_WM_TIMER() afx_msg void OnTimer( UINT ); 

Переменную Test я завел для остановки и запуска таймера. Следующим шагом, объявлена реакция на событие в таблице откликов. Реализация реакции простая. В наш список добавляется строка "Timer !", для визуального контроля над процессом.

Дальше у нас реакция на нажатие кнопки. Смотри в корень! Запускается и останавливается таймер в зависимости от содержания переменной Test. SetTimer запускает таймер. В эту функцию передаётся идентификатор (имя) таймера и интервал реакции.

CWnd::SetTimer( UINT nIDEvent, UINT nElapse, void (CALLBACK EXPORT* lpfnTimer));
// nIDEvent Не нулевой идентификатор таймера
// UINT nElapse Интервал задержки
// void (CALLBACK EXPORT* lpfnTimer) Функция вызова. Если NULL то будет генерироваться сообщение

После использования таймер нужно убить с помощью функции KillTimer, указав идентификатор таймера.

CWnd::KillTimer(int nIDEvent);
// nIDEvent Не нулевой идентификатор таймера
//Функция возвращает ненулевое значение в случае удачного попадания, ой убийства таймера.

Последние строки это установка начального значения переменной Test в самом начале. Итак, запускаем. Нажимаем на кнопку, в списке добавляются строки. Нажимаем еще раз - всё остановилось. Вот так.

Шпаргалка

У таймера должен быть ненулевой идентификатор.

#define ID_TIMER_1 100

Реакция на таймер должна быть в таблице отклика.

ON_WM_TIMER()

И функция должна быть реализована.

afx_msg void OnTimer( UINT );

Запуск - Остановка.

SetTimer(....);
KillTimer(....);

Загрузить проект | Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 24.09.99 (обновлено 5.07.2001)