c++ - 系统运行时是否有延迟计时器?

标签 c++ windows winapi timer sleep

为了实现我的 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);

这非常有效,但有一个警告(如果系统未进入休眠模式或休眠状态。)在这种情况下,下图最好地说明了发生的情况:

enter image description here

当我需要它做的是:

enter image description here

这里有计时器来做我想做的事吗?

附言。我的服务拷贝从多个工作站向我们的 Web 服务器提交报告。使用我上面的技术,我尝试随机化提交时间以减轻服务器工作量。由于所有工作站都进入休眠状态,然后大致同时唤醒,因此当机器从 sleep 状态唤醒时,我的“随机化”技术不起作用。

PS2。我需要指出,我需要它才能在 Windows XP 下工作。

最佳答案

您需要在系统进入休眠模式时收到通知,从这里开始。

当您收到带有PBT_ABTSUSPENDWM_POWERBROADCAST 时,请停止计时器并记录剩余时间。当接收到 PBT_ABTRESUMESUSPEND 事件时,在剩余时间再次启动计时器。

关于c++ - 系统运行时是否有延迟计时器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30281128/

相关文章:

c++ - 内存泄漏二叉搜索树

java - 执行java应用程序的批处理文件

c++ - 如何在另一个 DLL 的 DLL 上使用 `/DELAYLOAD`

c - 使用 CreateProcess() 启动进程时出现问题

c++ - 恢复中止的下载?

c++ - C与C++,void **指针的处理

c++ - Clang 不导出 C++ 符号

c++ - Mac OSX Yosemite 上的编译器 (Apple LLVM 7.0) 无法识别父类成员变量

python - Windows 64 位和普通 Python 3.5 上的 Theano

windows - .git 文件夹是跨平台的吗?