2012-01-04 17 views
9

私のプログラムは、ハードディスクの空き容量でタスクを実行します。 タスクはかなり長いです、それは1-2時間かかりますプログラムによるWindowsのハードディスクドライブのスピンダウンを防ぐ方法はありますか?

問題は、ラップトップでは、ユーザーが使用していないときに数分後にハードディスクがオフになることがあるという点です。

Windowsをハードディスクからスピンダウン(電源オフ)することをプログラムで防止するにはどうすればよいですか?

+4

コントロールパネルとは異なる電源プランを手動で設定してください。私は背中の背後にある電源プランを変更するプログラムを削除します。 – kludg

+10

コンピュータは使用中にディスクの電源を切断しますか?それは本当に私にとって正しいとは言えません。本気ですか? –

+0

要するに、アクティブなディスク書き込み中にウィンドウがディスクの電源を切ることはありませんが、OPが適切なファイル読み取りまたはファイル書き込みを行っていないため、Windowsがディスクまたはコンピュータ全体をサスペンドする可能性があります。 OPは問題を少し誤って表明しているかもしれません。 –

答えて

9

システムがアイドルモードにならないようにするには、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; 

またはWindows 7用に設計された機能PowerCreateRequestPowerSetRequestPowerClearRequestの新しいセットも利用可能である:使用量がこのようにすることができますが、これはまた、ディスクのパワーダウンタイマーに影響を与える場合、私はわからないんだけどドキュメントは混乱しており、現時点での使用例は見つかりませんでした。

また、PowerWriteACValueIndexまたはPowerWriteDCValueIndex機能で、電源設定をGUID_DISK_SUBGROUPのサブグループに変更することもできます。

+0

感謝。それはそれだ! – user382591

+0

どういたしまして。あなたはポストから、コード例を使用しているとにかく何?それは 'SetThreadExecutionState'もタイマーをディスクパワーダウンリセット影響することを意味していますか?MSDNのドキュメントされかなり弱いです(そして、私は_untested_に関する注釈を削除したいと思います)。だから私は尋ねています:)ありがとう – TLama

+1

私はそれをテストしました。それは魅力のように働きます。 SetThreadExecutionStateはディスクパワーダウンタイマーのリセットにも影響します。 – user382591

5

Windowsでは、バグの多いアプリケーションでバッテリが放電していたため、アプリケーションで電源制御の変更を無効にすることはできません。 http://blogs.msdn.com/b/oldnewthing/archive/2007/04/16/2148139.aspx

システムの電源状態を変更しようとしているときに通知を受け取ることができます。 WM_POWERBROADCAST Messagesを参照してください。

+1

しかし、あなたはTLamaが言ったように((あなたがシステムあなたが表示をオフにしたくないを伝える必要があり、あなたが映画を見ているときなど)、および私見それが何であるかだあなたがあなたの仕事のために余分な時間を必要とするシステムに伝えること彼のコメントには)のための関数 'SetThreadExecutionState'があります。実際にあなたは電源プランを破っています。あなたは映画を見に述べたように –

+0

@Martinは、あなたが使用することができます[ 'SetThreadExecutionState'](http://msdn.microsoft.com/en-us/library/windows/desktop/aa373208%28v=vs.85%29。 aspx)に 'ES_DISPLAY_REQUIRED'フラグをつけて表示を続けてください。問題は、この機能がディスクアイドルタイマーにも当てはまる場合、私にはわかりません(テストマシンはありません)。 – TLama

関連する問題