Определение состояния простоя на машине с Windows
Я знаю о методе GetLastInputInfo, но это дало бы мне только продолжительность с момента последнего пользовательского ввода - клавиатуры или мыши. Если пользовательский ввод последний раз был получен 10 минут назад, это не означало бы, что система простаивала в течение 10 минут - сканирование, загрузка, просмотр фильмов - множество причин.
Итак, как мы можем определить, действительно ли система простаивает или нет?
Кто-нибудь знает, каково определение Window "бездействия"? Должна быть комбинация пороговых значений - например, загрузка процессора менее 5%, загрузка диска менее 3% и т. Д. - вместе с пользовательским входным параметром... кто-нибудь знает точное определение?
2 ответа
Поскольку большинство приложений Windows управляются пользовательским интерфейсом, а пользовательский интерфейс Windows управляется извлечением сообщений из очереди сообщений, один из распространенных способов определить, когда приложение "простаивает", - это когда в его очереди сообщений нет сообщений.
В приложении Windows всегда есть сообщения (генерируемые пользователем и системой), но в типичном приложении вы часто увидите короткие периоды простоя. Когда мышь перемещается над окном в вашем приложении, ваши периоды простоя будут уменьшаться почти до нуля, пока мышь не перестанет двигаться, потому что активность мыши генерирует большую активность сообщений.
Таким образом, в цикле сообщений вашего приложения Windows, если вы в настоящее время используете GetMessage, вам нужно будет изменить цикл, чтобы использовать вместо него PeekMessage. GetMessage блокируется, когда очередь сообщений пуста, пока не прибудет сообщение. PeekMessage возвращает true, если в очереди есть сообщение, или false, если его нет. С помощью флагов вы можете заставить PeekMessage получать сообщение в одном вызове.
Когда PeekMessage возвращает false, вы можете перенаправить выполнение на вашу "бездействующую" задачу вместо ожидания следующего сообщения.
В приложениях WinForms используйте событие Application.Idle
Не делайте слишком много в своем простом коде, иначе ваш пользовательский интерфейс будет вялым, потому что сообщения не обрабатываются быстро. Чрезмерное использование цикла простоя также заставит ваш процессор сильно нагреваться и разряжать батарею вашего ноутбука.
Там нет истинного определения "простоя". Это было бы то, что вы хотели бы.