長時間実行されるタスクは、シャットダウンが開始されるまでにシャットダウンをブロックすることを意味します。は、シャットダウンが開始されます。シャットダウンによって中断したくないタスクがある場合、タスクは最初にShutdownBlockReasonCreate()
を呼び出す必要があり、終了するとShutdownBlockReasonDestroy()
を呼び出す必要があります。ユーザーはまだシャットダウンを強制することができます。
シャットダウンが一度開始されると、シャットダウンはブロックされず、シャットダウンを強制するためにOSが介入するまで短時間だけ延長することができます。あなたがそれを避けることができる場合、シャットダウンは開始する悪い時です新しい長期的なタスクです。
は、詳細については、MSDNを参照してください。
Application Shutdown Changes in Windows Vista
Changes to power management in Windows Vista
Now that Windows makes it harder for your program to block shutdown, how do you block shutdown?
非常に少なくとも、あなたがシャットダウン時にタスクを実行するために、時間の長い期間を必要とする場合、 WM_QUERYENDESSION
を受け取ったらShutdownBlockReasonCreate()
に電話し、シャットダウンを続行するためにTRUEを返してから、を受け取ったらタスクを実行する必要があります10。 WM_QUERYENDESSION
を数秒以上ブロックしないでください。そうしないと、Windowsが介入してアプリをすぐに終了させる可能性が高くなります。
これは、アプリケーションがTRUEに応答した後にシャットダウンが実際に進まない可能性があるため、WM_QUERYENDSESSION
でも重要です。 WM_QUERYENDSESSION
が送信されると、Windowsはシャットダウンの許可をアプリケーションに要求しています(またはシャットダウンが強制されることを伝える)が、実際にシャットダウンしていません。あなたのアプリがWM_ENDSESSION
を受け取ると、シャットダウンが実際に実行されていること(そしてその理由)が分かります。この流れはまた、MSDNで説明されています
Shutdown Changes for Windows Vista
Restart Manager | Guidelines for Applications
あなたがこれらのガイドラインに従っている場合でも、Windowsはまだあなたが無期限にシャットダウンをブロックできるようにするつもりはありません。それはあなたに30秒、1分などの余分な時間を与えるかもしれません。あなたのアプリのシャットダウンロジックはできるだけ速くなければなりません。もしそうなら、シャットダウンロジックを再設計してスピードアップしなければなりません。
多くの感謝!私は何ができるかを確認します。ユースケースは、顧客がシャットダウン時にバックアップジョブを実行することです。彼らが取る時間は変わるかもしれません。シャットダウンでアプリケーションを起動させるのではなく、アプリケーションがシャットダウンを呼び出させることをお勧めします。 – superflexible