SetPriorityClass 関数 (processthreadsapi.h)
指定したプロセスの優先度クラスを設定します。 この値は、プロセスの各スレッドの優先度値と共に、各スレッドの基本優先度レベルを決定します。
構文
BOOL SetPriorityClass(
[in] HANDLE hProcess,
[in] DWORD dwPriorityClass
);
パラメーター
[in] hProcess
プロセスへのハンドル。
ハンドルには 、PROCESS_SET_INFORMATION アクセス権が必要です。 詳細については、「 プロセス のセキュリティとアクセス権」を参照してください。
[in] dwPriorityClass
プロセスの優先度クラス。 このパラメーターには、次の値のいずれかを指定できます。
戻り値
関数が成功すると、戻り値は 0 以外になります。
関数が失敗した場合は、0 を返します。 詳細なエラー情報を得るには、GetLastError を呼び出します。
解説
すべてのスレッドには、スレッドの優先度値とそのプロセスの優先度クラスによって決まる基本優先度レベルがあります。 システムは、すべての実行可能スレッドの基本優先度レベルを使用して、CPU 時間の次のスライスを取得するスレッドを決定します。 SetThreadPriority 関数を使用すると、プロセスの優先度クラスに対する相対的なスレッドの基本優先度レベルを設定できます。 詳細については、「 スケジュールの優先順位」を参照してください。
*_PRIORITY_CLASS値は、プロセスの CPU スケジューリング優先順位に影響します。 ファイル I/O、ネットワーク I/O、データ処理などのバックグラウンド処理を実行するプロセスでは、CPU スケジュールの優先順位を調整するだけでは十分ではありません。アイドル状態の CPU 優先度プロセスであっても、ディスクとメモリを使用すると、システムの応答性に簡単に干渉する可能性があります。 バックグラウンド作業を実行するプロセスでは、 PROCESS_MODE_BACKGROUND_BEGIN と PROCESS_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 |