Как удерживать ожидающий таймер на неопределенный срок - PullRequest
2 голосов
/ 01 марта 2012

Скажите, у меня есть следующий код C ++.

Сначала я создаю ручной таймер ожидания как таковой:

HANDLE hWTimer = CreateWaitableTimer(NULL, FALSE, NULL);

Затем устанавливается заранее определенное время в будущем, чтобы оно срабатывало один раз (фактическое значение предоставляется пользовательским вводом):

double fSeconds2Wait = 10000;

LARGE_INTEGER li;
//Convert to 100 nanosecond intervals (MUST BE NEGATIVE)
li.QuadPart = -10000000LL * (LONGLONG)fSeconds2Wait;

SetWaitableTimer(hWTimer, &li, 0, NULL, NULL, 0);

Тогда у меня есть рабочий поток, который находится в состоянии ожидания, ожидая срабатывания таймера:

WaitForSingleObject(hWTimer, INFINITE);

//Perform actions when timer fires

Вопрос, который у меня возникает, скажем, если я хочу удерживать 'hWTimer' неопределенно долго с возможностью сброса его на другое время позже (по запросу пользователя), как мне это сделать?

1 Ответ

0 голосов
/ 01 марта 2012

из документов MSDN

Для SetWaitableTimer

Таймеры изначально неактивны.Чтобы активировать таймер, вызовите SetWaitableTimer.Если таймер уже активен при вызове SetWaitableTimer, таймер останавливается, а затем снова активируется.Остановка таймера таким образом не устанавливает состояние таймера в состояние сигнализации, поэтому потоки, заблокированные в операции ожидания на таймере, остаются заблокированными.Однако он отменяет все ожидающие процедуры завершения.

и For CancelWaitableTimer

Функция CancelWaitableTimer не изменяет сигнальное состояние таймера.Он останавливает таймер, прежде чем он может быть установлен в сигнальное состояние, и отменяет неподтвержденные APC.Поэтому потоки, выполняющие операцию ожидания на таймере, остаются в ожидании до истечения времени ожидания или до тех пор, пока таймер не будет повторно активирован и его состояние не установлено как сигнальное.Если таймер уже находится в сигнальном состоянии, он остается в этом состоянии.

Чтобы повторно активировать таймер, вызовите функцию SetWaitableTimer.

Таким образом, вы можете отложить таймер (и поток), вызвав CancelWaitableTimer и по запросу пользователя перезапустите его, вызвав SetWaitableTimer.

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