Определение состояния простоя на машине с Windows - PullRequest
3 голосов
/ 09 ноября 2009

Я знаю о методе GetLastInputInfo, но он дал бы мне только продолжительность с момента последнего пользовательского ввода - клавиатуры или мыши. Если пользовательский ввод был последний раз получен 10 минут назад, это не означало бы, что система простаивала в течение 10 минут - сканирование, загрузка, просмотр фильмов - множество причин.

Так как же мы можем определить, действительно ли система простаивает или нет?

Кто-нибудь знает, каково определение Window "бездействия"? Должно быть сочетание пороговых значений - например, загрузка процессора менее 5%, загрузка диска менее 3% и т. Д. - вместе с пользовательским параметром ввода ... кто-нибудь знает точное определение?

Ответы [ 2 ]

2 голосов
/ 09 июня 2010

Поскольку большинство приложений Windows управляются пользовательским интерфейсом, а пользовательский интерфейс Windows управляется извлечением сообщений из очереди сообщений, один из распространенных способов определить, когда приложение находится в режиме ожидания, - это отсутствие сообщений в своей очереди сообщений.

В приложении Windows всегда есть сообщения (генерируемые пользователем и системой), но в типичном приложении вы часто увидите короткие периоды простоя. Когда мышь перемещается над окном в вашем приложении, ваши периоды простоя будут уменьшаться до нуля, пока мышь не перестанет двигаться, потому что активность мыши генерирует большую активность сообщений.

Итак, в цикле сообщений вашего приложения Windows, если вы в настоящее время используете GetMessage, вам нужно будет изменить цикл, чтобы использовать вместо него PeekMessage. GetMessage блокируется, когда очередь сообщений пуста, пока не прибудет сообщение. PeekMessage возвращает true, если в очереди есть сообщение, или false, если его нет. С помощью флагов вы можете заставить PeekMessage получать сообщение в одном вызове.

Когда PeekMessage возвращает значение false, вы можете перенаправить выполнение на вашу «бездействующую» задачу вместо ожидания следующего сообщения.

В приложениях WinForms используйте событие Application.Idle

Не делайте слишком много в своём бездействующем коде, иначе ваш интерфейс будет вялым, потому что сообщения не обрабатываются быстро. Чрезмерное использование цикла простоя также заставит ваш процессор сильно нагреваться и разряжать батарею вашего ноутбука.

2 голосов
/ 09 ноября 2009

Не существует истинного определения "холостого хода". Это было бы то, что вы хотели бы.

...