Остановите компьютер с Windows 7 от перехода в спящий режим во время выполнения программы Ruby - PullRequest
5 голосов
/ 08 ноября 2010

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

Любые сумасшедшие идеи приветствуются; -)

Ответы [ 3 ]

6 голосов
/ 09 ноября 2010

Здесь - это совет по использованию SetThreadExecutionState Функция WinAPI, которая позволяет приложению информировать систему о том, что она используется, что предотвращает переход системы в спящий режимотключение дисплея во время работы приложения.
Что-то вроде:

require 'Win32API'
ES_AWAYMODE_REQUIRED = 0x00000040
ES_CONTINUOUS = 0x80000000
ES_DISPLAY_REQUIRED = 0x00000002
ES_SYSTEM_REQUIRED = 0x00000001
ES_USER_PRESENT = 0x00000004
func = Win32API.new 'kernel32','SetThreadExecutionState','L'

func.call(ES_CONTINUOUS|ES_SYSTEM_REQUIRED)
# doing your stuff...
func.call(ES_CONTINUOUS)


Или просто положить что-нибудь на клавиатуру (вы сказали сумасшедшие идеи приветствуются )
2 голосов
/ 09 ноября 2010

Если это программа командной строки, то вы можете отправлять команды из Ruby в командную строку, используя обратные пометки, подобные этой

puts `command here`

, поэтому вы можете перевести компьютер в спящий режим, отправив эту команду

c:\windows\system32\powercfg.exe -change -standby-timeout-ac 0

вот так

puts `c:\\windows\\system32\\powercfg.exe -change -standby-timeout-ac 0`

Вы должны сбежать \ с двойным.Проверено и работает у меня, хотя и на ноутбуке.Я предполагаю, что он будет работать так же на рабочем столе.

Число в самом конце - это время в минутах перед тем, как перевести компьютер в спящий режим.Я не знаю, можете ли вы получить исходное значение, но вы можете установить его на любое число.Таким образом, чтобы перевести компьютер в спящий режим через 10 минут, вы должны отправить

puts `c:\\windows\\system32\\powercfg.exe -change -standby-timeout-ac 10`

, чтобы вы могли отключить спящий режим в начале сценария и затем снова включить спящий режим.

Надеюсь, что это подходит для вас!

0 голосов
/ 08 ноября 2010

Я мало что делаю на платформе Windows, но следующий подход кажется логичным:

  1. В вашей программе используйте все доступные ruby ​​libs для платформы Windows, чтобы проверить, включен ли автоподвеска / сон.
  2. Если включено, отключите его.
  3. Запускай свои длинные задания.
  4. После этого снова включите авто приостановку / сон

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

Кроме того, приложение может нуждаться в запуске под учетной записью, имеющей доступ для включения / отключения автоматической приостановки.

Надеюсь, это поможет!

...