2012-02-29 64 views
2

说,我有以下的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

从MSDN文档(用简单的谷歌搜索找到) - 定时器最初是无效的。要激活定时器,请调用SetWaitableTimer。如果定时器在调用SetWaitableTimer时已处于活动状态,则定时器停止,然后重新激活。以这种方式停止定时器不会将定时器状态设置为发信号,因此在定时器的等待操作中被阻塞的线程将被阻塞。但是,它会取消任何未完成的完成例程。 – Dampsquid 2012-02-29 22:10:44

+0

@Dampsquid我很抱歉,但是这怎么回答我的问题? – ahmd0 2012-02-29 22:13:24

+0

它说,你可以打电话的时候,它已经运行了SetWaitableTimer,并重新启动它 – Dampsquid 2012-02-29 22:15:48

回答

0

从MSDN文档

对于SetWaitableTimer

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

和对于CancelWaitableTimer

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

要重新计时,调用SetWaitableTimer功能。

所以从这个可以通过调用CancelWaitableTimer抱过你的计时器(和线程),并从用户的请求,通过调用SetWaitableTimer重新启动它。