SetThreadPriority 函式 (processthreadsapi.h)
設定指定線程的優先順序值。 這個值與線程進程的優先順序類別一起,決定線程的基底優先順序層級。
語法
BOOL SetThreadPriority(
[in] HANDLE hThread,
[in] int nPriority
);
參數
[in] hThread
要設定其優先順序值的線程句柄。
句柄必須具有 THREAD_SET_INFORMATION 或 THREAD_SET_LIMITED_INFORMATION 訪問許可權。 如需詳細資訊,請參閱 線程安全性和訪問許可權。Windows Server 2003: 句柄必須具有 THREAD_SET_INFORMATION 訪問許可權。
[in] nPriority
線程的優先順序值。 此參數可以是下列其中一個值。
如果線程具有 REALTIME_PRIORITY_CLASS 基類,此參數也可以是 -7、-6、-5、-4、-3、3、4、5 或 6。 如需詳細資訊,請參閱 排程優先順序。
傳回值
如果函式成功,則傳回非零的值。
如果此函式失敗,則傳回值為零。 若要取得擴充的錯誤資訊,請呼叫 GetLastError。
Windows Phone 8.1:Windows Phone 市集應用程式可能會呼叫此函式,但沒有任何作用。 函式會傳回指出成功的非零值。
備註
每個線程都有一個基底優先順序層級,由線程的優先順序值和其進程的優先順序類別決定。 系統會使用所有可執行線程的基底優先順序層級來判斷哪一個線程會取得下一個 CPU 時間配量。 線程會以迴圈配置資源的方式排程在每個優先順序層級,而且只有在較高層級沒有可執行線程時,才會在較低層級排程線程。
SetThreadPriority 函式會啟用相對於其進程優先順序類別的線程基底優先順序層級。 例如,在對 IDLE_PRIORITY_CLASS 進程線程的 SetThreadPriority 呼叫中指定 THREAD_PRIORITY_HIGHEST ,會將線程的基底優先順序層級設定為 6。 如需顯示優先順序類別和線程優先順序值之每個組合之基底優先順序層級的數據表,請參閱 排程優先順序。
針對 IDLE_PRIORITY_CLASS、 BELOW_NORMAL_PRIORITY_CLASS、 NORMAL_PRIORITY_CLASS、 ABOVE_NORMAL_PRIORITY_CLASS和 HIGH_PRIORITY_CLASS 進程,系統會在線程發生重要事件時動態提升線程的基底優先順序層級。 REALTIME_PRIORITY_CLASS 進程不會收到動態提升。
所有線程一開始都會在 THREAD_PRIORITY_NORMAL開始。 使用 GetPriorityClass 和 SetPriorityClass 函式來取得和設定進程的優先順序類別。 使用 GetThreadPriority 函式來取得線程的優先順序值。
使用程式的優先順序類別來區分時間關鍵的應用程式,以及符合一般或低於一般排程需求的應用程式。 使用線程優先順序值來區分進程工作的相對優先順序。 例如,處理視窗輸入的線程可能會有比執行 CPU 大量計算的線程更高的優先順序層級。
操作優先順序時,請務必謹慎確保高優先順序線程不會耗用所有可用的CPU時間。 具有高於 11 之基底優先順序層級的線程會干擾操作系統的正常作業。 使用 REALTIME_PRIORITY_CLASS 可能會導致磁碟快取無法排清、導致滑鼠停止回應等等。
THREAD_PRIORITY_* 值會影響線程的 CPU 排程優先順序。 對於執行檔案 I/O、網路 I/O 或數據處理等背景工作的線程,無法調整 CPU 排程優先順序;即使閑置的 CPU 優先順序線程在使用磁碟和記憶體時,也可以輕鬆地干擾系統回應性。 執行背景工作的線程應該使用 THREAD_MODE_BACKGROUND_BEGIN 和 THREAD_MODE_BACKGROUND_END 值來調整其資源排程優先順序;與用戶互動的線程不應使用 THREAD_MODE_BACKGROUND_BEGIN。
當線程處於背景處理模式時,應該將重要區段、堆積和處理等共用資源降到最低,否則可能會發生優先順序反轉。 如果有線程以高優先順序執行,背景處理模式中的線程可能不會立即排程,但永遠不會耗盡。
Windows Server 2008 和 Windows Vista: 當系統啟動時, SetThreadPriority 函式會傳回成功傳回值,但不會變更從系統啟動資料夾或列在 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run 登錄機碼的應用程式線程優先順序。 這些應用程式會以較短的優先順序執行, (大約 60 秒) ,讓系統在啟動期間更回應用戶動作。
Windows 8.1和 Windows Server 2012 R2:Windows 市集應用程式支援此函式。
Windows Phone 8.1:Windows Phone Store 應用程式可能會呼叫此函式,但沒有任何作用。
範例
下列範例示範如何使用線程背景模式。
#include <windows.h>
#include <tchar.h>
int main( void )
{
DWORD dwError, dwThreadPri;
if(!SetThreadPriority(GetCurrentThread(), THREAD_MODE_BACKGROUND_BEGIN))
{
dwError = GetLastError();
if( ERROR_THREAD_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 thread priority
dwThreadPri = GetThreadPriority(GetCurrentThread());
_tprintf(TEXT("Current thread priority is 0x%x\n"), dwThreadPri);
//
// Perform background work
//
;
if(!SetThreadPriority(GetCurrentThread(), THREAD_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 Vista、Windows 7、Windows Server 2008 Windows Server 2008 R2) |
程式庫 | Kernel32.lib;Windows Phone 8.1 上的 WindowsPhoneCore.lib |
Dll | Kernel32.dll;Windows Phone 8.1 上的 KernelBase.dll |