我知道 GetLastInputInfo 方法,但这只会给我自上次用户输入(键盘或鼠标)以来的持续时间。如果最后一次收到用户输入是在 10 分钟前,那并不意味着系统已经空闲了 10 分钟——扫描、下载、电影——有很多原因。
那么如何判断系统是否真正空闲呢?
有谁知道Window对“空闲”的定义是什么?必须是阈值的组合——比如低于 5% 的 cpu util、低于 3% 的磁盘 util 等——以及用户输入参数......有人知道确切的定义吗?
我知道 GetLastInputInfo 方法,但这只会给我自上次用户输入(键盘或鼠标)以来的持续时间。如果最后一次收到用户输入是在 10 分钟前,那并不意味着系统已经空闲了 10 分钟——扫描、下载、电影——有很多原因。
那么如何判断系统是否真正空闲呢?
有谁知道Window对“空闲”的定义是什么?必须是阈值的组合——比如低于 5% 的 cpu util、低于 3% 的磁盘 util 等——以及用户输入参数......有人知道确切的定义吗?
“空闲”没有真正的定义。它会是你想要的任何东西。
由于大多数 Windows 应用程序都是 UI 驱动的,并且 Windows UI 是通过从消息队列中获取消息来驱动的,因此定义应用程序何时“空闲”的一种常见方法是它的消息队列中没有消息。
Windows 应用程序中总是有消息飞来飞去(用户生成的和系统生成的),但您会在典型的应用程序中看到频繁的短空闲期。当鼠标移动到应用程序的窗口上时,您的空闲时间将降至接近零,直到鼠标停止移动,因为鼠标活动会产生大量消息活动。
因此,在您的 Windows 应用程序的消息循环中,如果您当前正在使用 GetMessage,您将需要更改您的循环以使用 PeekMessage。GetMessage 在消息队列为空时阻塞,直到消息到达。如果队列中有消息,则 PeekMessage 返回 true,如果没有则返回 false。使用标志,您可以使 PeekMessage 在同一个调用中获取消息。
当 PeekMessage 返回 false 时,您可以将执行转移到您的“空闲”任务,而不是等待下一条消息。
在 WinForms 应用程序中,使用Application.Idle 事件
但是不要在你的空闲代码中做太多,否则你的 UI 会因为消息没有被快速处理而感到迟钝。过度使用空闲周期也会使您的 CPU 过热并耗尽笔记本电脑的电池。