プロセス優先度クラスとスレッド優先度は、スレッドの構築base priorityです。優先順位がどのように組み立てられるかについては、優先順位のスケジューリングを参照してください。このリストを見ると、あなたの理解がある程度正しいことが明らかになります。特定のプライオリティ クラス内で、base priorityは によって決定されるさまざまな値を持つことができますthread priority。
のPROCESS_MODE_BACKGROUND_BEGIN値SetPriorityClassと のTHREAD_MODE_BACKGROUND_END値はSetThreadPriority、すべての Windows バージョンでサポートされているわけではありません。
PROCESS_MODE_BACKGROUND_BEGIN:
システムは、プロセス (およびそのスレッド) のリソース スケジューリング優先度を下げて、フォアグラウンドでのアクティビティに大きな影響を与えずにバックグラウンド作業を実行できるようにします。
THREAD_MODE_BACKGROUND_END:
バックグラウンド処理モードを終了します。システムは、スレッドがバックグラウンド処理モードに入る前のスレッドのリソース スケジューリング優先度を復元します。
ここで問題となっているシナリオの結果は予測可能です。SetPriorityClassは、すべてのスレッドを含むプロセスを に設定しますbackground processing mode。以下SetThreadPriorityは、 からのスレッドのみを解放しますbackground processing mode。ただし、プロセスの他のすべての可能なスレッドは、バックグラウンド処理モードのままになります。
注:との組み合わせのみがprocess priority class を thread priority決定しbase priorityます。したがって、 への呼び出しも への呼び出しも基本優先度を返しGetThreadPriorityません。GetPriorityClassそれらの組み合わせのみが、上記の「スケジューリング優先度」リンクで説明されている基本優先度を解放します。残念ながら、新しいbackground processing mode値はまだbase priorityリストに含まれていません。しかし、名前base priorityはここで重要なことを示しています。基本優先度 (プロセス優先度クラスとスレッド優先度から派生) に基づいて、スケジューラーはスケジューリング優先度を動的に適応させることができます。fine tuneバックグラウンド モードは、スケジューリングの優先度を高める方法の 1 つです。もう 1 つの方法は、プライオリティ ブーストです。プライオリティ ブースト機能はしばらくの間存在します。への新しいアクセスbackground processing modeの値を指定SetThreadPriorityしてSetPriorityClass、優先ブースト機能を直接開きます。Windows XP では、SetProcessPriorityBoostを呼び出してこれを行う必要がありました。