Funzione SetThreadPriority (processthreadsapi.h)
Imposta il valore di priorità per il thread specificato. Questo valore, insieme alla classe priority del processo del thread, determina il livello di priorità di base del thread.
Sintassi
BOOL SetThreadPriority(
[in] HANDLE hThread,
[in] int nPriority
);
Parametri
[in] hThread
Handle per il thread il cui valore di priorità deve essere impostato.
L'handle deve avere il diritto di accesso THREAD_SET_INFORMATION o THREAD_SET_LIMITED_INFORMATION . Per altre informazioni, vedere Thread Security and Access Rights.For more information, see Thread Security and Access Rights. Windows Server 2003: L'handle deve avere il diritto di accesso THREAD_SET_INFORMATION .
[in] nPriority
Valore di priorità per il thread. Questo parametro può avere uno dei valori seguenti.
Se il thread ha la classe base REALTIME_PRIORITY_CLASS , questo parametro può essere anche -7, -6, -5, -4, -3, 3, 4, 5 o 6. Per altre informazioni, vedere Pianificazione delle priorità.
Valore restituito
Se la funzione ha esito positivo, il valore restituito è diverso da zero.
Se la funzione ha esito negativo, il valore restituito è zero. Per informazioni dettagliate sull'errore, chiamare GetLastError.
Windows Phone 8.1: le app dello Store Windows Phone possono chiamare questa funzione, ma non ha alcun effetto. La funzione restituirà un valore diverso da zero che indica l'esito positivo.
Commenti
Ogni thread ha un livello di priorità di base determinato dal valore di priorità del thread e dalla classe di priorità del processo. Il sistema usa il livello di priorità di base di tutti i thread eseguibili per determinare quale thread ottiene la sezione successiva del tempo cpu. I thread vengono pianificati in modo round robin a ogni livello di priorità e solo quando non sono presenti thread eseguibili a un livello superiore esegue la pianificazione dei thread a un livello inferiore.
La funzione SetThreadPriority consente di impostare il livello di priorità di base di un thread rispetto alla classe di priorità del processo. Ad esempio, specificando THREAD_PRIORITY_HIGHEST in una chiamata a SetThreadPriority per un thread di un processo di IDLE_PRIORITY_CLASS imposta il livello di priorità di base del thread su 6. Per una tabella che mostra i livelli di priorità di base per ogni combinazione di classe di priorità e valore di priorità del thread, vedere Pianificazione priorità.
Per i processi di IDLE_PRIORITY_CLASS, BELOW_NORMAL_PRIORITY_CLASS, NORMAL_PRIORITY_CLASS, ABOVE_NORMAL_PRIORITY_CLASS e HIGH_PRIORITY_CLASS , il sistema aumenta dinamicamente il livello di priorità di base di un thread quando si verificano eventi importanti per il thread. REALTIME_PRIORITY_CLASS processi non ricevono boost dinamici.
Tutti i thread iniziano inizialmente a THREAD_PRIORITY_NORMAL. Usare le funzioni GetPriorityClass e SetPriorityClass per ottenere e impostare la classe di priorità di un processo. Usare la funzione GetThreadPriority per ottenere il valore di priorità di un thread.
Usare la classe di priorità di un processo per distinguere tra le applicazioni che sono critiche per il tempo e quelle con requisiti di pianificazione normali o inferiori ai normali requisiti di pianificazione. Usare i valori di priorità del thread per distinguere le priorità relative delle attività di un processo. Ad esempio, un thread che gestisce l'input per una finestra può avere un livello di priorità superiore rispetto a un thread che esegue calcoli intensivi per la CPU.
Quando si modificano le priorità, prestare molta attenzione a garantire che un thread ad alta priorità non consumi tutto il tempo di CPU disponibile. Un thread con un livello di priorità di base superiore a 11 interferisce con il normale funzionamento del sistema operativo. L'uso di REALTIME_PRIORITY_CLASS può causare la mancata scaricamento delle cache del disco, causare l'interruzione della risposta del mouse e così via.
I valori THREAD_PRIORITY_* influiscono sulla priorità di pianificazione della CPU del thread. Per i thread che eseguono operazioni in background, ad esempio I/O di file, I/O di rete o elaborazione dati, non è sufficiente regolare la priorità di pianificazione della CPU; anche un thread di priorità CPU inattiva può interferire facilmente con la velocità di risposta del sistema quando usa il disco e la memoria. I thread che eseguono operazioni in background devono usare i valori THREAD_MODE_BACKGROUND_BEGIN e THREAD_MODE_BACKGROUND_END per regolare le priorità di pianificazione delle risorse; i thread che interagiscono con l'utente non devono usare THREAD_MODE_BACKGROUND_BEGIN.
Quando un thread è in modalità di elaborazione in background, deve ridurre al minimo la condivisione di risorse come sezioni critiche, heap e handle con altri thread nel processo. In caso contrario, possono verificarsi inversioni prioritarie. Se sono presenti thread in esecuzione con priorità elevata, un thread in modalità di elaborazione in background potrebbe non essere pianificato tempestivamente, ma non verrà mai risolto.
Windows Server 2008 e Windows Vista: Durante l'avvio del sistema, la funzione SetThreadPriority restituisce un valore restituito con esito positivo, ma non modifica la priorità del thread per le applicazioni avviate dalla cartella di avvio del sistema o elencate nella chiave del Registro di sistema HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run . Queste applicazioni vengono eseguite con priorità ridotta per un breve periodo di tempo (circa 60 secondi) per rendere il sistema più reattivo alle azioni dell'utente durante l'avvio.
Windows 8.1 e Windows Server 2012 R2: questa funzione è supportata per le app di Windows Store.
Windows Phone le app dello Store 8.1:Windows Phone possono chiamare questa funzione, ma non ha alcun effetto.
Esempio
Nell'esempio seguente viene illustrato l'uso della modalità in background del thread.
#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;
}
Requisiti
Requisito | Valore |
---|---|
Client minimo supportato | Windows XP [app desktop | App UWP] |
Server minimo supportato | Windows Server 2003 [app desktop | App UWP] |
Piattaforma di destinazione | Windows |
Intestazione | processthreadsapi.h (include Windows.h in Windows Vista, Windows 7, Windows Server 2008 Windows Server 2008 R2) |
Libreria | Kernel32.lib; WindowsPhoneCore.lib in Windows Phone 8.1 |
DLL | Kernel32.dll; KernelBase.dll Windows Phone 8.1 |