如何无限期地延迟等待计时器 我说,我有以下C++代码。

如何无限期地延迟等待计时器 我说,我有以下C++代码。,c++,winapi,timer,C++,Winapi,Timer,首先,我创建了一个手动可等待计时器: HANDLE hWTimer = CreateWaitableTimer(NULL, FALSE, NULL); 然后将其设置为将来的预定义时间以触发一次(实际值由用户输入提供): 然后我有一个处于等待状态的工作线程,等待计时器启动: WaitForSingleObject(hWTimer, INFINITE); //Perform actions when timer fires 我的问题是,如果我想无限期地推迟“hWTimer”,并可能在以后(根据

首先,我创建了一个手动可等待计时器:

HANDLE hWTimer = CreateWaitableTimer(NULL, FALSE, NULL);
然后将其设置为将来的预定义时间以触发一次(实际值由用户输入提供):

然后我有一个处于等待状态的工作线程,等待计时器启动:

WaitForSingleObject(hWTimer, INFINITE);

//Perform actions when timer fires
我的问题是,如果我想无限期地推迟“hWTimer”,并可能在以后(根据用户请求)将其重置为另一个时间,我该如何做?

来自MSDN文档

用于SetWaitableTimer

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

和取消可等待计时器

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

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


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

来自MSDN文档(通过简单的谷歌搜索找到)-计时器最初处于非活动状态。要激活计时器,请调用SetWaitableTimer。如果调用SetWaitableTimer时计时器已处于活动状态,则计时器将停止,然后重新激活。以这种方式停止计时器不会将计时器状态设置为signaled,因此在计时器的等待操作中被阻止的线程仍然被阻止。但是,它确实会取消任何挂起的完成例程。@Dampsquid很抱歉,但这如何回答我的问题?它说,当SetWaitableTimer已经运行时,您可以调用它,它会重新启动itok听起来好像您需要取消WaitableTimer,如果您不希望它运行,然后在需要时重新启动用户操作。@Dampsquid:您应该将您的答案作为答案发布,ahmd0应该接受它。否则,这个问题将永远无法回答,而其他有同样问题的人将无法找到它。
WaitForSingleObject(hWTimer, INFINITE);

//Perform actions when timer fires