Таймеры в операционной системе Windows представляют собой механизм, с помощью которого можно вызывать на выполнение действия через заданный промежуток времени. Когда таймер срабатывает, приложению отсылается сообщение WM_TIMER, для которого можно построить обработчик.
События таймера ставятся в очередь событий приложения лишь в том случае, если приложение неактивно и его очередь сообщений пуста. Windows ставит в очередь событий только одно сообщение таймера. Если приложение активно и занято, сообщение таймера будет проигнорировано. Чтобы запустить или остановить таймер, нужно указать его идентификатор ID, который может принимать любое целое значение.
Создать приложение с двумя таймерами. Один таймер применить для поддержки часов приложения, второй - с управляемым пользователем интервалом срабатывания. Для этого нужно:
Таблица свойств главной диалоговой формы Timers | ||
---|---|---|
Элемент управления | Свойство | Значение |
Главная форма | Caption | Студент Иванов. Моделирование таймеров |
Font(Size) | MS Sans Serif(10) | |
Static Text | Caption | Сегодня |
Static Text | Caption | Текущая дата |
ID | IDC_STATICDATE | |
Static Text | Caption | Интервал таймера |
Edit Control | ID | IDC_INTERVAL |
Button | ID | IDC_STARTTIMER |
Caption | Пуск | |
Button | ID | IDC_STOPTIMER |
Caption | Стоп | |
Disabled | True | |
Static Text | Caption | Часы: |
Right Align Text | True | |
Static Text | ID | IDC_STATICTIME |
Caption | Текущее время: | |
Static Text | Caption | Счетчик: |
Right Align Text | True | |
Static Text | ID | IDC_STATICCOUNT |
Caption | 0 | |
Button | ID | IDC_EXIT |
Caption | Выход |
Интерфейс окна приложения должен получиться таким
Обработчик сообщения OnBnClickedExit() класса CTimersDlg файла TimersDlg.cpp void CTimersDlg::OnBnClickedExit() { // TODO: Add your control notification handler code here OnOK(); }
В данном приложении будут использованы два таймера: управляемый и неуправляемый. Чтобы однозначно определить таймер, ему нужно присвоить уникальный идентификатор и добавить в приложение идентификаторы таймеров. Для этого:
Можно увидеть, что оболочка добавит в заголовочный файл ресурсов две строки:
Изменения в заголовочном файле ресурсов Resource.h //{{NO_DEPENDENCIES}} // Microsoft Visual C++ generated include file. // Used by Timers.rc // #define ID_CLOCK_TIMER 1 #define ID_COUNT_TIMER 2 #define IDM_ABOUTBOX 0x0010 #define IDD_ABOUTBOX 100 #define IDS_ABOUTBOX 101 #define IDD_TIMERS_DIALOG 102 #define IDR_MAINFRAME 128 #define IDC_INTERVAL 1000 #define IDC_STARTTIMER 1001 #define IDC_STOPTIMER 1002 #define IDC_EXIT 1003 #define IDC_STATICCOUNT 1004 #define IDC_STATICTIME 1005 #define IDC_STATICDATE 1006 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 129 #define _APS_NEXT_COMMAND_VALUE 32771 #define _APS_NEXT_CONTROL_VALUE 1007 #define _APS_NEXT_SYMED_VALUE 103 #endif #endif
Изменения в функции OnInitDialog() класса CTimersDlg файла TimersDlg.cpp BOOL CTimersDlg::OnInitDialog() { CDialog::OnInitDialog(); ..................................... // TODO: Add extra initialization here // Запустить таймер часов SetTimer(ID_CLOCK_TIMER, 1000, NULL); return TRUE; // return TRUE unless you set the focus to a control }
Таймер запускается функцией SetTimer(). Первым аргументом является идентификатор таймера. Второй аргумент определяет частоту в миллисекундах. В данном случае таймер каждые 1000 миллисекунд (каждую секунду) будет генерировать сообщение WM_TIMER. Третий необязательный аргумент - адрес функции обратного вызова, которая должна вызываться при каждом срабатывании таймера. Если поставить NULL (пустой указатель), то сообщение WM_TIMER будет отослано в очередь сообщений Windows.
Функция обратного вызова - это созданная разработчиком приложения функция, которая вызывается непосредственно операционной системой.