如何无限期推迟可等待计时器

How to hold off a waitable timer indefinitely

本文关键字:等待 计时器 推迟 无限期      更新时间:2023-10-16

比方说,我有以下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",并有可能稍后(根据用户请求)将其重置为另一个时间,我该怎么做?

来自MSDN Docs

对于SetWaitableTimer

计时器最初处于非活动状态。要激活计时器,请调用SetWaitableTimer。如果在调用SetWaitableTimer时计时器已处于活动状态,则计时器将停止,然后重新激活。以这种方式停止计时器不会将计时器状态设置为已发出信号,因此在计时器的等待操作中被阻止的线程仍然被阻止。但是,它确实取消了任何挂起的完成例程。

和CancelWaitableTimer

CancelWaitableTimer函数不会更改计时器的信号状态。它会在定时器设置为信号状态之前停止定时器,并取消未完成的APC。因此,对计时器执行等待操作的线程将一直等待,直到它们超时,或者计时器被重新激活,并且其状态被设置为发出信号。如果计时器已经处于发出信号的状态,它将保持在该状态。

要重新激活计时器,请调用SetWaitableTimer函数。

因此,您可以通过调用CancelWaitableTimer来推迟计时器(和线程),并根据用户的请求,通过调用SetWaitableTimeer来重新启动计时器。