2008年11月5日水曜日

Vistaのタスクスケジューラと電源コントロール

Vistaになってスリープ機能がすばらしいので積極的に使っていこうと1時間でスリープに入るように設定したんだが、タスクスケジューラでスリープから起動したタスクが終了前に1時間立ってしまってタスクの途中でスリープに入ってしまうことがあって困ってた。

いろいろ調べたけど、どうも今タスクがBUSYだというシグナルをアプリから一定間隔で出し続けないとOS側がタスクのスレッドが動いていようがビジー状態じゃないのでスリープに移行してしまうみたい。

私が主にやってるタスクは、HDDレコーダからのムービーのダウンロードとエンコード。エンコードはCPUパワーを使うのでビジー状態が保てているみたいなんだが、どうもダウンロードは負荷がネットワークとHDDのIOにしかかからないためビジー状態と認識されないみたい。
ムービーをダウンロードしている途中でスリープに入っちゃって、家に帰ってきてから起動するとダウンロードの途中状態で起動してしかもタイムアウトしました!みたいなエラーになってしまう。

で、アプリにシグナル仕込むのも面倒なので電源コントロールをバッチの最初にやって、スリープしない設定にしてタスク終了時にスリープするモードにもどしてやることにした。
PowerCfg.exeを使うとコマンドラインから操作できるみたいでこいつをバッチファイルにしてしまおう。

PowerHi.bat
PowerCfg.exe -S ????????-????-????-????-????????????

こんな感じの(?のところは自分で設定したスリープしない電源オプションのID)を実行してみる。
コマンドラインでpowercfg -getactivescheme ってやると、現在の電源オプションのGUIDが手に入るのでそれを入れる。

PowerStd.bat も作って今度は1時間でスリープするような通常の電源オプションに変更。
call PowerHi.bat
call daily_task.bat
call PowerStd.bat

っていうかんじで呼び出してやったらうまくいかないかな~
とりあえず設定してねまふ

0 件のコメント: