0

初めてのポスター、優しくしてください;-)

私は、Windows サービスとして実行され、WASAPI を使用してジャックのラインからサンプルを取得し、それに対して何らかの処理を行うオーディオ アプリ (C++) を作成しています。

アプリが「記録」しているときに、Windows が自動的にサスペンドまたは休止状態にならないことに気付きました。

電源イベント通知に登録しました。サスペンド ボタンを自分で押すと、サービスが適切な電源イベントを取得し、正常に処理します。システムをそのままサスペンドしたままにしておくと、電源イベントがまったく受信されません。

WASAPI を参照するコードの一部を削除すると、電源イベントは手動および自動サスペンドの両方で通常どおり受信されます。したがって、Windows に自動サスペンド タイマーを無視するように指示する WASAPI の使用について何かがあるようです。

誰でもこの動作を説明できますか?それを止めるために私にできることはありますか? 自分のアプリが誤動作し、システムが中断するのを防ぐアプリの 1 つにはなりたくない..

4

4 に答える 4

5

残念ながら、あなたが望むことを行うメカニズムはありません.オーディオストリームを開くと、ネットワークや他の多くのことのいずれかを介してファイルを開く場合と同様に、電源状態の遷移が防止されます.

これはオーディオ ドライバー (portcls.sys) の機能であり、WASAPI ではなく、Vista の新しい動作ではありません。XP と Win2K は同様の動作をしていたと思います (ただし、電源状態の遷移は、XP よりも Vista の方がはるかに信頼性が高くなります)。および Win2K であるため、ユーザーはより依存する傾向があります)。

Windows 7 では、「powercfg -requests」を使用して、システムのいずれかの部分がマシンのスリープへの移行を妨げているかどうかを確認できます。詳細については、こちらをご覧ください

于 2009-03-17T02:01:17.027 に答える
3

この動作が設計によるものであり、私がばかげたことをしていないことを確認してくれた Larry に感謝します。

この問題を回避するために、Win32 CallNtPowerInformation()API を使用してシステム アイドル タイマーを取得しました。

SYSTEM_POWER_INFORMATION spi = {0};
NTSTATUS status = CallNtPowerInformation(SystemPowerInformation, NULL, 0, 
                                         &spi, sizeof(spi));

if (NT_SUCCESS(status) && (spi.TimeRemaining==0))
{
    // should have gone to sleep
}

メンバーは、コントロール パネルでユーザーが指定した時間 (1 時間後のシステム スタンバイなど) からカウントダウン(spi.TimeRemaining秒単位) し、CPU 使用率 (パーセンテージ) が を超えるたびにリセットされますspi.MaxIdlenessAllowed

spi.TimeRemainingゼロになった場合、システムはスリープ状態になっているはずなので、すべての WASAPI ハンドルを閉じてスリープ状態にします。

于 2009-04-09T12:03:40.503 に答える
0

電源管理 API には、システムがしばらくの間省電力モードに入らないようにすることをアプリが OS に伝えることができる機能があると思います (これはオン/オフ タイプの機能だと思います)。WASAPI の何かがそのメソッドを呼び出している場合は、何もできない可能性があります。電源管理サービスは、電源モードがどのようにアクティブ化されているかに応じて、アプリの要求を受け入れるように強制されないため、これはハードウェア ボタンの動作で理にかなっています。

回避策については、わかりません。私が試みるかもしれないことの 1 つは、電源管理 API から省電力タイムアウト情報を読み取り、システムが省電力しきい値に近づいている場合は記録を一時停止することです。それがどれほど難しいかはわかりませんが。幸運を。:)

于 2009-03-13T18:22:54.400 に答える
0

私が試みるかもしれないことの 1 つは、電源管理 API から省電力タイムアウト情報を読み取り、システムが省電力しきい値に近づいている場合は記録を一時停止することです。

良いアイデアですが、かなり難しいと思います。省電力タイムアウトは、電源管理 API を使用して読み取ることができますが、Windows サービスから読み取ることができない現在のユーザー入力のアイドル状態も知る必要があります。

于 2009-03-14T09:39:12.323 に答える