質問

最近、Windows Mobile 6.1 Professionalを実行する新しい携帯電話を購入しました。そしてもちろん、私は現在、趣味でコーディングを検討しています。私の計画では、サービスをDLLとして実行し、Services.exeによってロードします。これには、SOMデータを収集し、一定の間隔(5〜10分ごと)でSOM処理を行う必要があります。

これを定期的に実行する必要があるので、システムがユーザーによる短い非アクティブ期間の後に通常スリープ(サスペンド)するのは少し問題です。

このテーマに関するMSDNおよびMSDNブログで見つけることができるすべてのドキュメントを読んでいますが、この問題には3つの解決策があると思われます:

  1. 定期的に SystemIdleTimerReset を呼び出して、システムを「常にオン」状態に保ちます。これは少し過剰に思えるので、問題外です。

  2. CeRunAppAtTime でシステムを定期的に起動し、無人状態に移行して処理を行います。

  3. 完全なサスペンドに入る代わりに、無人状態を使用します。これはユーザーには透過的ですが、システムはスリープ状態になりません。

2番目のアプローチが好ましいようですが、これには、起動時にシステムが実行可能ファイルを呼び出す必要があり、処理を開始する必要があることをサービスに通知する唯一のタスクが必要です。これは少し不必要なようで、この余分な実行可能ファイルは避けたいと思います。もちろん、すべての処理をこの追加の実行可能ファイルに移動することもできますが、サービスとして実行するときに提供される機能の一部を使用し、処理が開始されるたびに(バックグラウンドであっても)プログラムがポップアップしないようにします。

一見したところ、3番目のアプローチには最初のアプローチと同じ基本的な問題があるようです。ただし、いくつかのMSDNブログで、頻繁にサスペンドモードに出入りする代わりに、このアプローチで実際にバッテリー消費を節約できる可能性があることを読んでいます(これに対する議論は、WMプラットフォームの性質がシステムがアイドル状態のときにバッテリー消費が非常に少なくなるようにします。また、サスペンドの内外での処理にはかなりの処理が必要です。

だから、私の質問は次のようだと思います:

  • 私の状況ではどのアプローチをお勧めしますか?バッテリー消費を最小限に抑え、きれいに実装することに関して。

  • アプローチ番号2の場合、通知実行可能ファイルの必要性を排除することは可能ですか?代替API関数を使用するか、プラットフォーム上の既存の汎用アプリケーションを使用しますか?

  • アプローチ番号3の場合、クレームに関連する情報/統計を知っていますか?サスペンドに入ることで無人モードを使用する場合、バッテリーの寿命を延ばすことができます。例えば。無人モードを優先する前に、どのくらいの頻度でシステムをサスペンド状態から解除する必要がありますか。

  • 実装固有の(ボーナス)質問:無人モードを継続するには、 SystemIdleTimerReset を定期的に呼び出す必要がありますか?

そして最後に、もし私がアプローチ番号1を時期尚早に排除したと思うなら、理由を教えてください。


知識に基づいて回答するか、単に推測するだけであるかを回答に含めてください(後者も大歓迎です!)。

この質問の一部を明確にする必要があると思われる場合は、コメントを残してください。

役に立ちましたか?

解決

CERunAppAtTimeは、非常に誤解されているAPIです(ほとんどの場合、ひどい名前のため)。アプリを実行する必要はありません 。名前付きシステムイベントを設定するだけです(MSDNのpwszAppNameパラメーターの説明を参照してください) docs )。いつ起動したかを知りたい場合(アプリが処理を完了したら、デバイスをスリープ状態に戻すため)、同じ名前のイベントでWaitForSingleObjectを実行しているワーカースレッドを用意するだけです。

無人状態は、アプリを継続的に実行する必要があるデバイス(MP3プレーヤーなど)でよく使用されますが、バックライトをシャットダウンして電力を節約します(おそらく最も電力を消費する単一のサブシステム)。

明らかに、無人モードではサスペンドよりも大幅に多くの電力が使用されます。サスペンドでは、RAMのセルフリフレッシュにのみ電力が消費されるためです。無人モードでは、プロセッサは電力を供給されて実行されています(いくつかの周辺機器も同様です-OEMが無人モードを定義した方法によって異なります)。

SystemIdleTimerResetは、非アクティブのために電源管理者がデバイスを低電力モードにできないようにするだけです。このモードは、中断、無人、飛行、その他のいずれであっても、OEMによって定義されます。使用するとデバイスの電力消費に影響するため、控えめに使用してください。無人モードでそれを行うと、ユーザーの観点からは特に問題があります。ユーザーはデバイスがオフになっていると思うかもしれません(そのように見えます)が、バッテリーの寿命が短くなりました。

他のヒント

WMがあなたがやろうとしていることをサポートするように設計されていないので、許容できるバッテリー寿命が得られると期待してはならない方法を詳述した長い投稿がありました。ウェイクアップ時にサービスに信号を送り、処理を行い、この投稿を使用して、デバイスをすぐにスリープ状態に戻します。このようにして、睡眠時間と睡眠時間の比率を非常に低く保つことができますが、あなたが言うように、私は推測しているだけです。

参照:

電力効率の高いアプリ(MSDN)

人々への力開発者1 開発者2 デバイス

電源-効率的なWMアプリ(ブログ投稿)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top