SetPriorityClass 関数 (processthreadsapi.h)

指定したプロセスの優先度クラスを設定します。 この値は、プロセスの各スレッドの優先度値と共に、各スレッドの基本優先度レベルを決定します。

構文

BOOL SetPriorityClass(
  [in] HANDLE hProcess,
  [in] DWORD  dwPriorityClass
);

パラメーター

[in] hProcess

プロセスへのハンドル。

ハンドルには 、PROCESS_SET_INFORMATION アクセス権が必要です。 詳細については、「 プロセス のセキュリティとアクセス権」を参照してください。

[in] dwPriorityClass

プロセスの優先度クラス。 このパラメーターには、次の値のいずれかを指定できます。

優先度 意味
ABOVE_NORMAL_PRIORITY_CLASS
0x00008000
NORMAL_PRIORITY_CLASSより優先度が高いが、HIGH_PRIORITY_CLASS未満のプロセス。
BELOW_NORMAL_PRIORITY_CLASS
0x00004000
IDLE_PRIORITY_CLASSより優先度が高いが、NORMAL_PRIORITY_CLASSを下回るプロセス。
HIGH_PRIORITY_CLASS
0x00000080
すぐに実行する必要があるタイム クリティカルなタスクを実行するプロセス。 このプロセスのスレッドは、Normal または Idle 優先順位クラスのプロセスのスレッドよりも優先します。 たとえば、タスク リストは、オペレーティング システムの負荷に関係なく、ユーザーが呼び出したときに迅速に応答する必要があります。 優先度の高いクラスを使用する場合は細心の注意を払います。これは、優先度の高いクラス アプリケーションで使用可能なすべての CPU 時間を使用できるためです。
IDLE_PRIORITY_CLASS
0x00000040
システムがアイドル状態の場合にのみスレッドが実行されるプロセス。 このプロセスのスレッドよりも、より高い優先順位クラスで実行されているあらゆるプロセスのスレッドの方が優先します。 たとえばスクリーン セーバーなどです。 アイドル優先度クラスは、子プロセスによって継承されます。
NORMAL_PRIORITY_CLASS
0x00000020
特別なスケジュール設定を必要としないプロセス。
PROCESS_MODE_BACKGROUND_BEGIN
0x00100000
バックグラウンド処理モードを開始します。 システムは、フォアグラウンドでのアクティビティに大きな影響を与えることなくバックグラウンド作業を実行できるように、プロセス (およびそのスレッド) のリソース スケジュールの優先順位を下げる。

この値は、 hProcess が現在のプロセスのハンドルである場合にのみ指定できます。 プロセスが既にバックグラウンド処理モードになっている場合、関数は失敗します。

Windows Server 2003 および Windows XP: この値はサポートされていません。

PROCESS_MODE_BACKGROUND_END
0x00200000
バックグラウンド処理モードを終了します。 システムは、プロセスがバックグラウンド処理モードに入る前と同じように、プロセス (およびそのスレッド) のリソース スケジューリングの優先順位を復元します。

この値は、 hProcess が現在のプロセスのハンドルである場合にのみ指定できます。 プロセスがバックグラウンド処理モードでない場合、関数は失敗します。

Windows Server 2003 および Windows XP: この値はサポートされていません。

REALTIME_PRIORITY_CLASS
0x00000100
可能な限り高い優先度を持つプロセス。 プロセスのスレッドは、重要なタスクを実行するオペレーティング システム プロセスを含め、他のすべてのプロセスのスレッドを優先します。 たとえば、非常に短い間隔を超えて実行されるリアルタイム プロセスでは、ディスク キャッシュがフラッシュされないか、マウスが応答しなくなる可能性があります。

戻り値

関数が成功すると、戻り値は 0 以外になります。

関数が失敗した場合は、0 を返します。 詳細なエラー情報を得るには、GetLastError を呼び出します。

解説

すべてのスレッドには、スレッドの優先度値とそのプロセスの優先度クラスによって決まる基本優先度レベルがあります。 システムは、すべての実行可能スレッドの基本優先度レベルを使用して、CPU 時間の次のスライスを取得するスレッドを決定します。 SetThreadPriority 関数を使用すると、プロセスの優先度クラスに対する相対的なスレッドの基本優先度レベルを設定できます。 詳細については、「 スケジュールの優先順位」を参照してください。

*_PRIORITY_CLASS値は、プロセスの CPU スケジューリング優先順位に影響します。 ファイル I/O、ネットワーク I/O、データ処理などのバックグラウンド処理を実行するプロセスでは、CPU スケジュールの優先順位を調整するだけでは十分ではありません。アイドル状態の CPU 優先度プロセスであっても、ディスクとメモリを使用すると、システムの応答性に簡単に干渉する可能性があります。 バックグラウンド作業を実行するプロセスでは、 PROCESS_MODE_BACKGROUND_BEGINPROCESS_MODE_BACKGROUND_END の値を使用して、リソーススケジュールの優先順位を調整する必要があります。ユーザーと対話するプロセスでは 、PROCESS_MODE_BACKGROUND_BEGINを使用しないでください。

プロセスがバックグラウンド処理モードの場合、作成する新しいスレッドもバックグラウンド処理モードになります。 スレッドがバックグラウンド処理モードの場合、プロセス内の他のスレッドとのクリティカル セクション、ヒープ、ハンドルなどのリソースの共有を最小限に抑える必要があります。そうしないと、優先順位の逆転が発生する可能性があります。 優先度の高いスレッドが実行されている場合、バックグラウンド処理モードのスレッドは速やかにスケジュールされないことがありますが、枯渇することはありません。

各スレッドは、 SetThreadPriority を使用して個別にバックグラウンド処理モードに入ることができます。 プロセス内のスレッドが SetThreadPriority を呼び出してバックグラウンド処理モードに入った後、SetPriorityClass を呼び出してバックグラウンド処理モードに入らないでください。 プロセスがバックグラウンド処理モードを終了すると、プロセス内のすべてのスレッドがリセットされます。ただし、どのスレッドが既にバックグラウンド処理モードであったかをプロセスで認識することはできません。

次の例では、プロセス バックグラウンド モードの使用を示します。

#include <windows.h>
#include <tchar.h>

int main( void )
{
   DWORD dwError, dwPriClass;

   if(!SetPriorityClass(GetCurrentProcess(), PROCESS_MODE_BACKGROUND_BEGIN))
   {
      dwError = GetLastError();
      if( ERROR_PROCESS_MODE_ALREADY_BACKGROUND == dwError)
         _tprintf(TEXT("Already in background mode\n"));
      else _tprintf(TEXT("Failed to enter background mode (%d)\n"), dwError);
      goto Cleanup;
   } 

   // Display priority class

   dwPriClass = GetPriorityClass(GetCurrentProcess());

   _tprintf(TEXT("Current priority class is 0x%x\n"), dwPriClass);

   //
   // Perform background work
   //
   ;

   if(!SetPriorityClass(GetCurrentProcess(), PROCESS_MODE_BACKGROUND_END))
   {
      _tprintf(TEXT("Failed to end background mode (%d)\n"), GetLastError());
   }

Cleanup:
   // Clean up
   ;
return 0;
}

要件

要件
サポートされている最小のクライアント Windows XP [デスクトップ アプリ | UWP アプリ]
サポートされている最小のサーバー Windows Server 2003 [デスクトップ アプリのみ | UWP アプリ]
対象プラットフォーム Windows
ヘッダー processthreadsapi.h (Windows Server 2003、Windows Vista、Windows 7、Windows Server 2008 Windows Server 2008 R2 の Windows.h を含む)
Library Kernel32.lib
[DLL] Kernel32.dll

関連項目

CreateProcess

CreateThread

GetPriorityClass

GetThreadPriority

プロセス関数とスレッド関数

処理

優先度のスケジュール設定

SetThreadPriority