Как программно предотвратить вращение жесткого диска в Windows? - PullRequest
9 голосов
/ 05 января 2012

Моя программа выполняет задачу на свободном месте на жестком диске. Задача довольно длинная, она занимает 1-2 часа .

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

Как программно предотвратить вращение жесткого диска в Windows (отключение питания)?

Ответы [ 2 ]

9 голосов
/ 05 января 2012

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

type
  EXECUTION_STATE = DWORD;

const
  ES_SYSTEM_REQUIRED = $00000001;
  ES_DISPLAY_REQUIRED = $00000002;
  ES_USER_PRESENT = $00000004;
  ES_AWAYMODE_REQUIRED = $00000040;
  ES_CONTINUOUS = $80000000;

function SetThreadExecutionState(esFlags: EXECUTION_STATE): EXECUTION_STATE;
  stdcall; external 'kernel32.dll' name 'SetThreadExecutionState';

procedure TForm1.Button1Click(Sender: TObject);
begin
  if SetThreadExecutionState(ES_CONTINUOUS or ES_SYSTEM_REQUIRED or
    ES_AWAYMODE_REQUIRED) <> 0 then
  try
    // execute your long running task here
  finally
    SetThreadExecutionState(ES_CONTINUOUS);
  end;
end;

Или также доступен новый набор функций PowerCreateRequest, PowerSetRequest и PowerClearRequest, разработанные для Windows 7, но документация сбивает с толку, и я пока не нашел ни одного примера их использования.

Или вы можете изменить параметры питания с помощью функций PowerWriteACValueIndex или PowerWriteDCValueIndex с подгруппой параметров питания GUID_DISK_SUBGROUP.

5 голосов
/ 05 января 2012

Windows не позволяет приложениям отключать изменения управления питанием, потому что глючные приложения вызывали разрядку батарей.См. http://blogs.msdn.com/b/oldnewthing/archive/2007/04/16/2148139.aspx

. Вы можете получить уведомление, когда состояние системы питания будет изменено.См. WM_POWERBROADCAST Сообщения .

...