Книга: Системное программирование в среде Windows

Пример: использование таймера ожидания

В программе 14.3 демонстрируется применение таймера ожидания для генерации периодических сигналов.

Программа 14.3. TimeBeep: генерация периодических сигналов 

/* Глава 14. TimeBeep.с. Периодическое звуковое оповещение.  */
/* Использование: TimeBeep период (в миллисекундах). */
#include "EvryThng.h"
static BOOL WINAPI Handler(DWORD CntrlEvent);
static VOID APIENTRY Beeper(LPVOID, DWORD, DWORD);
volatile static BOOL Exit = FALSE;
HANDLE hTimer;
int _tmain(int argc, LPTSTR argv[]) {
 DWORD Count = 0, Period;
 LARGE_INTEGER DueTime;
 /* Перехват нажатия комбинации клавиш <Ctrl-c> для прекращения операции. См. главу 4. */
 SetConsoleCtrlHandler(Handler, TRUE);
 Period = _ttoi(argv[1]) * 1000;
 DueTime.QuadPart = –(LONGLONG)Period * 10000;
 /* Параметр DueTime отрицателен для первого периода ожидания и задается относительно текущего времени. Период ожидания измеряется в мс (10-3 с), a DueTime — в единицах по 100 нc (10-7 с) для согласования с типом FILETIME. */
 hTimer = CreateWaitableTimer(NULL, FALSE /* "Таймер синхронизации" */, NULL);
 SetWaitableTimer(hTimer, &DueTime, Period, Beeper, &Count, TRUE);
 while (!Exit) {
  _tprintf(_T("Count = %dn"), Count);
  /* Значение счетчика увеличивается в процедуре таймера. */
  /* Войти в состояние дежурного ожидания. */
  SleepEx(INFINITE, TRUE);
 }
 _tprintf(_T("Завершение. Счетчик = %d"), Count);
 CancelWaitableTimer(hTimer);
 CloseHandle(hTimer);
 return 0;
}
static VOID APIENTRY Beeper(LPVOID lpCount, DWORD dwTimerLowValue, DWORD dwTimerHighValue) {
 *(LPDWORD)lpCount = *(LPDWORD)lpCount + 1; 
 _tprintf(_T("Генерация сигнала номер: %dn"), *(LPDWORD) lpCount);
 Веер(1000 /* Частота. */, 250 /* Длительность (мс). */);
 return;
}
BOOL WINAPI Handler(DWORD CntrlEvent) {
 Exit = TRUE;
 _tprintf(_T("Завершение работыn"));
 return TRUE;
}
 

Оглавление книги


Генерация: 1.277. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз