Condividi tramite


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.

Priorità Significato
THREAD_MODE_BACKGROUND_BEGIN
0x00010000
Avviare la modalità di elaborazione in background. Il sistema riduce le priorità di pianificazione delle risorse del thread in modo che possa eseguire operazioni in background senza influire significativamente sull'attività in primo piano.

Questo valore può essere specificato solo se hThread è un handle per il thread corrente. La funzione ha esito negativo se il thread è già in modalità di elaborazione in background.

Windows Server 2003: Questo valore non è supportato.

THREAD_MODE_BACKGROUND_END
0x00020000
Modalità di elaborazione in background finale. Il sistema ripristina le priorità di pianificazione delle risorse del thread così come erano prima che il thread entrasse in modalità di elaborazione in background.

Questo valore può essere specificato solo se hThread è un handle per il thread corrente. La funzione ha esito negativo se il thread non è in modalità di elaborazione in background.

Windows Server 2003: Questo valore non è supportato.

THREAD_PRIORITY_ABOVE_NORMAL
1
Priorità 1 al di sopra della classe di priorità.
THREAD_PRIORITY_BELOW_NORMAL
-1
Priorità 1 al di sotto della classe di priorità.
THREAD_PRIORITY_HIGHEST
2
Priorità 2 punti sopra la classe di priorità.
THREAD_PRIORITY_IDLE
-15
Priorità di base pari a 1 per i processi di IDLE_PRIORITY_CLASS, BELOW_NORMAL_PRIORITY_CLASS, NORMAL_PRIORITY_CLASS, ABOVE_NORMAL_PRIORITY_CLASS o HIGH_PRIORITY_CLASS e priorità di base pari a 16 per i processi di REALTIME_PRIORITY_CLASS .
THREAD_PRIORITY_LOWEST
-2
Priorità 2 punti sotto la classe di priorità.
THREAD_PRIORITY_NORMAL
0
Priorità normale per la classe priority.
THREAD_PRIORITY_TIME_CRITICAL
15
Priorità di base pari a 15 per i processi di IDLE_PRIORITY_CLASS, BELOW_NORMAL_PRIORITY_CLASS, NORMAL_PRIORITY_CLASS, ABOVE_NORMAL_PRIORITY_CLASS o HIGH_PRIORITY_CLASS e priorità di base pari a 31 per i processi di REALTIME_PRIORITY_CLASS .
 

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

Vedi anche

GetPriorityClass

GetThreadPriority

Funzioni di processi e thread

Priorità di pianificazione

SetPriorityClass

Thread