2011/07/03

pcSleep の技術的なお話。

 
pcSleep は Microsoft の Windows API に準じて、実装されています。
 
Microsoft の仕様として ソフトウェアレベルで起床した場合 
ユーザーの入力( マウス、キーボード)が一切無い場合 
 
起床から数分後に 自動的にスリープ してしまいます。
 
このままでは音楽ソフトウェアを実現する事もできません。そこでシステムに、
「まだ眠らないでね」とリクエスト送る API を用いる事で無人状態でも
起床状態を維持することができます。
 
 
しかし次の問題が出てきます。
 
API を使い続けている間は、スリープすることが出来ません。
 
 
今回苦戦したのが「いつ、このリクエストを止めるか」を違和感無く組み込む
です。
 
実装自体は簡単ですが…難しい。
 
ユーザーが入力を起こしたならリクエストを止め、ユーザーが触れない場合は
自身のスリープタイマーが再度有効になったら止めています。
 
あれ…書いてみるとそんなに大した事してないや。
 
  
pcSleep では「スリープ - 起床」の完全無人 永久タスク を実現する事が
できます。永久タスクとは、
 
「スリープ前、プログラム起動」 
「スリープ」
「起床」
「起床プログラム実行」
 
のフローについて人間が一切関わらず、永久に繰り返し行うことが出来るタスク
です。OS の電源設定にて「一定時間後にスリープ」を無効にしていれば、
期待通りに本ツールにて永久起動を繰り返せます。これにより、家に留守に
している間でも、30分に1回音楽を鳴らす、というのも繰り返し可能です。
  ( 「今からx分後にスリープ。その x分後に起床」というスケジューリングにて対応 )
 
Windows XP と Windows vista 以降では、復旧後の API 動作が異なるので、
これはやっかいでした。
 
・WindowsXP は EEEPC、デスクトップPC
・WindowsVista は BTOデスクトップ
・Windows7 は UL20FT, ET2002T
 
上記のプラットフォームにて API 差異を調べ、組み込んであります。
 
 
vet 1.08u からは、過去のバグ fix 含め、安定のソフトウェアとなっています。

0 件のコメント:

コメントを投稿