SetThreadPriority と SetThreadPriority のメモ
Windowsでプロセスやスレッドの優先度を指定する方法のメモ.
※OSのバージョン等によって,設定値や動作が違う場合がある模様なので注意.
優先度の基本的な考え方
- 0(もっとも低い)〜31(もっとも高い)であらわされる優先度によって,スレッドの実行をスケジューリング
- 優先度 = Process priority class (プロセスの優先度) + Thread priority level (スレッドの優先度)
プロセスの優先度について
プロセスの優先度を任意に変更するためには,たとえば次のように指定する.
// プロセスの優先度設定 → もっとも高い(REALTIME)
SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);
Priority Class の指定の仕方については,次の順番で優先度が高い.
REALTIME_PRIORITY_CLASS // もっとも優先 HIGH_PRIORITY_CLASS // 優先度高 ABOVE_NORMAL_PRIORITY_CLASS NORMAL_PRIORITY_CLASS // 通常 BELOW_NORMAL_PRIORITY_CLASS IDLE_PRIORITY_CLASS // アイドル時
スレッドの優先度について
スレッドの優先度について変更するためには,たとえば次のように指定する.
SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_NORMAL));
プロセスの優先度をもとに,相対値を指定する.次の順番で優先度が高い.
THREAD_PRIORITY_TIME_CRITICAL // 15 (プロセスが REALTIME_PRIORITY_CLASS のとき 31) THREAD_PRIORITY_HIGHEST // 基準 +2 THREAD_PRIORITY_ABOVE_NORMAL // 基準 +1 THREAD_PRIORITY_NORMAL // 基準 THREAD_PRIORITY_BELOW_NORMAL // 基準 -1 THREAD_PRIORITY_LOWEST // 基準 -2 THREAD_PRIORITY_IDLE // 1 (プロセスが REALTIME_PRIORITY_CLASS のとき 16)
Process priority class と Thread priority level の組み合わせ
最終的な優先度の値については,http://msdn.microsoft.com/en-us/library/ms685100(v=VS.85).aspx を参照すれば一目瞭然である.
参考
- SetPriorityClass Function (Windows),http://msdn.microsoft.com/en-us/library/ms686219(VS.85).aspx
- SetThreadPriority Function (Windows),http://msdn.microsoft.com/en-us/library/ms686277(VS.85).aspx
- Scheduling Priorities (Windows),http://msdn.microsoft.com/en-us/library/ms685100(v=VS.85).aspx