Windows System Programming Third Edition [Electronic resources]

Johnson M. Hart

نسخه متنی -صفحه : 291/ 216
نمايش فراداده

  • Example: Using a Waitable Timer

    Program 14-3 shows how to use a waitable timer to signal the user periodically.

    Program 14-3. TimeBeep.c: A Periodic Signal
    /* Chapter 14. TimeBeep.c. Periodic alarm.
    /* Usage: TimeBeep period (in milliseconds). */
    #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;
    /* Catch Ctrl-c to terminate operation. See Chapter 4. */
    SetConsoleCtrlHandler (Handler, TRUE);
    Period = _ttoi (argv [1]) * 1000;
    DueTime.QuadPart = -(LONGLONG)Period * 10000;
    /* Due time is negative for first time-out relative to
    current time. Period is in ms (10^-3 sec) whereas
    the due time is in 100 ns (10^-7 sec) units to be
    consistent with a FILETIME. */
    hTimer = CreateWaitableTimer (NULL,
    FALSE /* "Synchronization timer" */, NULL);
    SetWaitableTimer (hTimer, &DueTime, Period,
    Beeper, &Count, TRUE);
    while (!Exit) {
    _tprintf (_T ("Count = %d\n"), Count);
    /* Count is increased in the timer routine. */
    /* Enter an alertable wait state. */
    SleepEx (INFINITE, TRUE);
    }
    _tprintf (_T ("Shut down. Count = %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 ("Perform beep number: %d\n"), *(LPDWORD) lpCount);
    Beep (1000 /* Frequency. */, 250 /* Duration (ms). */);
    return;
    }
    BOOL WINAPI Handler (DWORD CntrlEvent)
    {
    Exit = TRUE;
    _tprintf (_T ("Shutting Down\n"));
    return TRUE;
    }
    

    Comments on the Waitable Timer Example

    There are four combinations based on timer type and whether you wait on the handle or use a completion routine.