如何无限期地推迟一个等待计时器

时间:2012-02-29 21:59:26

标签: c++ winapi timer

说,我有以下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 :(得分:0)

来自MSDN文档

适用于SetWaitableTimer

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

,对于CancelWaitableTimer

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

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

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