如何无限期推迟可等待计时器
How to hold off a waitable timer indefinitely
比方说,我有以下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来重新启动计时器。
相关文章:
- Linux的Cpp上的计时器
- 提升 ASIO 无法识别计时器对象
- 提升 asio 并发计时器取消问题与链
- 使用单体计时器的pthread_cond_timedwait有时会比预期晚超时
- 窗口中的微秒计时器
- 计时器是否从另一个线程启动?
- 如何在 c++ 中创建计时器
- C++回调计时器实现
- 在计时器或主线程外部的命令上销毁/替换线程
- 如何制作每秒从 30 乘 1 倒计时的计时器?
- 保留计时器集合(对象与指针)的最佳方法
- 在网络套接字计时器滴答后增加asio短读错误
- 设置可等待计时器和夏令时调整
- 等待计时器不等待指定的时间段
- 我可以通过其句柄判断可等待计时器何时会触发
- 如何在进程之间共享内核对象,例如可等待计时器
- C++计时器(等待一段时间)
- 如何无限期推迟可等待计时器
- 仅使用标准库实现等待计时器
- 用户计时器在第一次使用后出错,无论我等待多长时间都会返回零