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
執行必須立即執行之時間關鍵工作的程式。 該處理序的執行緒會優先於正常或閒置優先權類別處理序的執行緒。 範例是工作清單,無論操作系統上的負載為何,使用者呼叫時都必須快速回應。 使用高優先順序類別時使用非常小心,因為高優先順序類別應用程式可以使用幾乎所有可用的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
具有最高優先順序的程式。 進程的線程會先佔所有其他進程的線程,包括執行重要工作的操作系統進程。 例如,執行超過非常簡短間隔的即時程式可能會導致磁碟快取不會排清或造成滑鼠沒有回應。

傳回值

如果函式成功,則傳回非零的值。

如果此函式失敗,則傳回值為零。 若要取得擴充的錯誤資訊,請呼叫 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 進入背景處理模式之後,請勿呼叫 SetPriority 進入背景處理模式。 進程結束背景處理模式之後,它會重設進程中的所有線程;不過,進程不可能知道哪些線程已經在背景處理模式中。

範例

下列範例示範使用進程背景模式。

#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)
程式庫 Kernel32.lib
DLL Kernel32.dll

另請參閱

CreateProcess

CreateThread

GetPriorityClass

GetThreadPriority

處理序和執行緒函式

程序

排程優先順序

SetThreadPriority