.net - 识别 Windows 机器上的空闲状态

标签 .net windows idle-processing

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

那么如何判断系统是否真正空闲呢?

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

最佳答案

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

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

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

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

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

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

关于.net - 识别 Windows 机器上的空闲状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1702646/

相关文章:

c# - 使用 EasyNetQ.Hosepipe 时有没有办法指定不同的错误队列?

c# - 扩展 C# 中的现有结构以添加运算符

c# - 使用 C# 检索完整的进程列表

delphi - 为什么要在 getmessage 之前先 peekmessage?

delphi - 空闲delphi应用程序等待计时器的最安全方法?

ASP.NET 浏览器上限更新

c# - 使用 Microsoft Unity 进行异步/等待

windows - 在 Windows 上使用 native C++ 读取 WAV 文件

windows - 离线安装socket.io

matlab - 在matlab中空闲时调用函数运行