Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何通过编程防止Windows硬盘驱动器降速?_Windows_Delphi_Winapi_Hard Drive - Fatal编程技术网

如何通过编程防止Windows硬盘驱动器降速?

如何通过编程防止Windows硬盘驱动器降速?,windows,delphi,winapi,hard-drive,Windows,Delphi,Winapi,Hard Drive,我的程序在硬盘可用空间上执行任务。 任务相当长,需要1-2个小时 问题是,在笔记本电脑上,当用户处于非活动状态时,硬盘可能会在几分钟后关闭 如何以编程方式防止Windows硬盘降速(关机)?要防止系统进入空闲模式,您可以尝试使用该功能。此函数通知系统应用程序正在使用,并允许您指定线程的执行要求。用法可能是这样的,但我不确定这是否也会影响磁盘断电计时器: type EXECUTION_STATE = DWORD; const ES_SYSTEM_REQUIRED = $00000001;

我的程序在硬盘可用空间上执行任务。 任务相当长,需要1-2个小时

问题是,在笔记本电脑上,当用户处于非活动状态时,硬盘可能会在几分钟后关闭


如何以编程方式防止Windows硬盘降速(关机)?

要防止系统进入空闲模式,您可以尝试使用该功能。此函数通知系统应用程序正在使用,并允许您指定线程的执行要求。用法可能是这样的,但我不确定这是否也会影响磁盘断电计时器:

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;
类型
执行状态=DWORD;
常数
所需系统=00000001美元;
所需显示=00000002美元;
现有用户=00000004美元;
ES_AWAYMODE_所需=00000040美元;
ES_连续=80000000美元;
函数SetThreadExecutionState(esFlags:EXECUTION\u STATE):EXECUTION\u STATE;
stdcall;外部“kernel32.dll”名称“SetThreadExecutionState”;
程序TForm1.按钮1单击(发送方:TObject);
开始
如果SetThreadExecutionState(需要ES_CONTINUOUS或ES_SYSTEM)或
ES_AWAYMODE_必需)0然后
尝试
//在此处执行长时间运行的任务
最后
SetThreadExecutionState(连续);
结束;
结束;
或者也有为Windows7设计的新功能集,但是文档很混乱,我现在还没有找到任何使用它们的例子


或者,您可以通过电源设置的
GUID\u DISK\u子组
子组修改电源设置。

Windows不允许应用程序禁用电源控制更改,因为有缺陷的应用程序导致电池耗尽。看


当系统电源状态即将更改时,您会收到通知。请参阅。

手动设置与控制面板不同的电源计划。我会在背后删除一个改变电源计划的程序。计算机在使用时会关闭磁盘的电源吗?我觉得这听起来不太对。您确定吗?这不是“编程”,但您可以考虑在.>上打开驱动器索引。它永远不会停止,然后…我仍然在努力理解为什么一个应用程序执行一些操作,可能需要1到2个小时,将困扰10秒的启动时间。为什么要担心?@MartinJames,好吧,假设你的操作需要2个小时,并且每2.5分钟必须从磁盘读取数据。这将使磁盘恢复48次,如果像您所说的那样,旋转时间需要10秒,则需要额外8分钟才能完成该操作。这些文件在非常大之前无法加载到内存中,这取决于计算结果。我只是照原样回答这个问题;)但是,您可以告诉系统您需要额外的时间来完成任务(例如,当您观看电影时,您必须告诉系统您不想关闭显示器),并且IMHO这就是函数
SetThreadExecutionState
的作用(正如TLama在其评论中所说)。所以事实上你正在破坏电源计划。@Martin,正如你在看电影时提到的,你可以使用with
ES\u DISPLAY\u REQUIRED
标志来打开显示器。问题是我不确定(也没有测试机器)这个功能是否也适用于磁盘空闲计时器。不客气。不管怎样,你用了什么,这篇文章中的代码示例?这是否意味着
SetThreadExecutionState
也会影响重置磁盘断电计时器?MSDN文档非常弱(我想删除关于未测试的注释),这就是为什么我要问:)谢谢我测试了它。这很有魅力。。。SetThreadExecutionState还影响磁盘断电计时器的重置。