【问题标题】:Identifying idle state on a windows machine识别 Windows 机器上的空闲状态
【发布时间】:2010-12-14 17:31:42
【问题描述】:

我知道 GetLastInputInfo 方法,但这只会给我自上次用户输入(键盘或鼠标)以来的持续时间。如果最后一次收到用户输入是在 10 分钟前,那并不意味着系统已经空闲了 10 分钟 - 扫描、下载、电影 - 很多原因。

那么我们如何判断系统是否真的空闲呢?

有谁知道 Window 对“空闲”的定义是什么? 必须是阈值的组合——比如低于 5% 的 cpu util、低于 3% 的磁盘 util 等——以及用户输入参数...有人知道确切的定义吗?

【问题讨论】:

标签: .net windows idle-processing


【解决方案1】:

由于大多数 Windows 应用程序都是 UI 驱动的,并且 Windows UI 是通过从消息队列中获取消息来驱动的,因此定义应用程序何时“空闲”的一种常见方法是它的消息队列中没有消息。

Windows 应用程序中总是有消息飞来飞去(用户生成的和系统生成的),但您会在典型应用程序中看到频繁的短空闲期。当鼠标移动到应用中的某个窗口上时,您的空闲时间将降至接近于零,直到鼠标停止移动,因为鼠标活动会产生大量消息活动。

因此,在您的 Windows 应用程序的消息循环中,如果您当前正在使用 GetMessage,则需要更改您的循环以改用 PeekMessage。 GetMessage 在消息队列为空时阻塞,直到消息到达。如果队列中有消息,则 PeekMessage 返回 true,如果没有则返回 false。使用标志,您可以使 PeekMessage 在同一个调用中获取消息。

当 PeekMessage 返回 false 时,您可以将执行转移到您的“空闲”任务,而不是等待下一条消息。

在 WinForms 应用程序中,使用 Application.Idle event

不过,不要在空闲代码中做太多事情,否则你的 UI 会因为消息没有得到快速处理而感觉迟缓。过度使用空闲周期也会使您的 CPU 过热并耗尽笔记本电脑的电池。

【讨论】:

    【解决方案2】:

    “空闲”没有真正的定义。它会是你想要的任何东西。

    【讨论】:

    • Windows 的定义是什么?或者微软想要它是什么? :)
    • 我认为没有硬性规定。这取决于应用程序。
    猜你喜欢
    • 1970-01-01
    • 2012-04-01
    • 1970-01-01
    • 2011-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多