Сброс ожидаемых таймеров - PullRequest
2 голосов
/ 30 октября 2008

Из MSDN:

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

(Акцент мой)

Итак: Как установить таймер ожидания с ручным сбросом в состояние без сигнала, если я не могу вызвать CancelWaitableTimer? ResetEvent не работает с ожидаемыми таймерами (это происходит с ошибкой ERROR_INVALID_HANDLE).

Я не хочу использовать SetWaitableTimer, потому что (на данный момент) я не знаю, на какую длительность его установить. Я полагаю, я мог бы установить задержку на большое число, но для меня это немного похоже на взлом.

Ответы [ 2 ]

2 голосов
/ 30 октября 2008

Можете ли вы просто вызвать SetWaitableTimer с очень большим временем, которое никогда не произойдет? А затем позвоните еще раз, как только вы узнаете реальное время.

Обновление: Хак или нет, документы довольно ясно показывают, что ожидаемый таймер m-r "остается в сигнальном состоянии до тех пор, пока не будет вызван SetWaitableTimer". Сдается мне, что это функция, которую вы собираетесь использовать. Вам просто понадобится хорошая константа RESET_TIMER, которая установлена ​​в -2 ^ 63 или что-то в этом роде.

0 голосов
/ 23 июня 2009

Если вы сделаете автосброс ожидаемого таймера, он будет сброшен автоматически, как только закончится ожидание этого таймера.

Однако из MSDN:

Если несколько объектов становятся сигнальными, функция возвращает индекс первого дескриптора в массиве, объект которого был сигнализирован.

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

WaitForMultipleObjects () сканирует массив дескрипторов начиная с 0 и возвращает его, как только обнаруживает сигнальный дескриптор. Только этот первый найденный дескриптор сбрасывается в состояние без знака; остальные нетронуты.

См. Поведение WaitForMultipleObjects, когда несколько дескрипторов сигнализируют одновременно

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