为了实现我的 Windows 服务,我需要能够为系统处于工作状态的特定持续时间设置一个计时器。所以我最初想出了以下代码。
A) 设置一个可等待的计时器(省略错误检查):
HANDLE hWTimer = ::CreateWaitableTimer(NULL, FALSE, NULL);
//As an example, set timer to wait for 40 minutes
int nWaitMins = 40;
LARGE_INTEGER li;
ULONGLONG uiWaitMs = (ULONGLONG)nWaitMins * 60LL * 1000LL;
li.QuadPart = -10000LL * uiWaitMs; //Convert to 100 nanosecond intervals (must be negative for relative time)
::SetWaitableTimer(hWTimer, &li, 0, NULL, NULL, FALSE); //Don't wake the system
B) 等待它(从工作线程):
//Wait for timer to fire
::WaitForSingleObject(hWTimer, INFINITE);
这非常有效,但有一个警告(如果系统未进入休眠模式或休眠状态。)在这种情况下,下图最好地说明了发生的情况:
当我需要它做的是:
这里有计时器来做我想做的事吗?
附言。我的服务拷贝从多个工作站向我们的 Web 服务器提交报告。使用我上面的技术,我尝试随机化提交时间以减轻服务器工作量。由于所有工作站都进入休眠状态,然后大致同时唤醒,因此当机器从 sleep 状态唤醒时,我的“随机化”技术不起作用。
PS2。我需要指出,我需要它才能在 Windows XP 下工作。
最佳答案
您需要在系统进入休眠模式时收到通知,从这里开始。
当您收到带有PBT_ABTSUSPEND
的WM_POWERBROADCAST
时,请停止计时器并记录剩余时间。当接收到 PBT_ABTRESUMESUSPEND
事件时,在剩余时间再次启动计时器。
关于c++ - 系统运行时是否有延迟计时器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30281128/