Windows WaitableTimers в C ++ - PullRequest
       2

Windows WaitableTimers в C ++

2 голосов
/ 07 января 2011

Я пытаюсь установить ожидающие окна таймеры в C ++ следующим образом:

#define _SECOND 10000000
void Run()
{
    __int64 qwDueTime= 5 * _SECOND;

    LARGE_INTEGER   liDueTime;
    // Copy the relative time into a LARGE_INTEGER.
    liDueTime.LowPart  = (DWORD) ( qwDueTime & 0xFFFFFFFF );
    liDueTime.HighPart = (LONG)  ( qwDueTime >> 32 );

    SetWaitableTimer(
          CreateWaitableTimer(NULL,FALSE  ,L"2004"),
             &liDueTime,2000,
             (PTIMERAPCROUTINE)TimerFinished,NULL,FALSE );
    cout<<"Second"<<endl;
}

, где TimerFinished равно

VOID CALLBACK TimerFinished(
    LPVOID lpArg,               // Data value.
    DWORD dwTimerLowValue,      // Timer low value.
    DWORD dwTimerHighValue ) {  // Timer high value.

        cout<<"First"<<endl;
        cout.flush();
 }

Но, к сожалению, TimerFinished никогда не вызывается ..

Любая помощь?

Ответы [ 2 ]

7 голосов
/ 08 января 2011

Вы можете найти это полезным: http://msdn.microsoft.com/en-us/library/ms686289(v=vs.85).aspx

Цитата:

pDueTime [in]: время, по истечении которого состояние таймера устанавливается на сигнализацию,с интервалом в 100 наносекунд.Используйте формат, описанный структурой FILETIME. Положительные значения указывают абсолютное время .Обязательно используйте абсолютное время в формате UTC, поскольку система использует внутреннее время в формате UTC. Отрицательные значения указывают относительное время .Фактическая точность таймера зависит от возможностей вашего оборудования.Для получения дополнительной информации о времени в формате UTC см. Системное время.

Проблема заключается в том, что вы должны передать в SetWaitableTimer () значение отрицательное (т.е. через 5 секунд)потому что положительные значения указывают абсолютное время.Это разница между «двумя днями позже» (относительными) и «9 января» (абсолютными).

0 голосов
/ 07 октября 2018

После вашего вызова SetWaitableTimer вы должны перевести этот поток (в котором вы вызываете SetWaitableTimer) в состояние оповещения.

Чтобы перевести поток в состояние оповещения, вам необходимо вызвать SleepEx (), WaitForSingleObjectEx (), WaitForMultipleObjectsEx (), MsgWaitForMultipleObjectsEx (), SignalObjectAndWait () или любую другую функцию в той же группе, для параметра bAlertable которой установлено значение TRUE.

Также вы можете увидеть раздел «Таймеры ожидания», который подробно описан здесь: Учебное пособие по таймерам

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...