Freigeben über


SetThreadPriority-Funktion (processthreadsapi.h)

Legt den Prioritätswert für den angegebenen Thread fest. Dieser Wert bestimmt zusammen mit der Prioritätsklasse des Prozesses des Threads die Basisprioritätsebene des Threads.

Syntax

BOOL SetThreadPriority(
  [in] HANDLE hThread,
  [in] int    nPriority
);

Parameter

[in] hThread

Ein Handle für den Thread, dessen Prioritätswert festgelegt werden soll.

Das Handle muss über das THREAD_SET_INFORMATION - oder THREAD_SET_LIMITED_INFORMATION-Zugriffsrecht verfügen. Weitere Informationen finden Sie unter Threadsicherheit und Zugriffsrechte. Windows Server 2003: Das Handle muss über das THREAD_SET_INFORMATION-Zugriffsrecht verfügen.

[in] nPriority

Der Prioritätswert für den Thread. Dieser Parameter kann einen der folgenden Werte annehmen.

Priority Bedeutung
THREAD_MODE_BACKGROUND_BEGIN
0x00010000
Starten Sie den Hintergrundverarbeitungsmodus. Das System senkt die Ressourcenplanungsprioritäten des Threads, sodass hintergrundarbeiten ausgeführt werden können, ohne die Aktivität im Vordergrund erheblich zu beeinträchtigen.

Dieser Wert kann nur angegeben werden, wenn hThread ein Handle für den aktuellen Thread ist. Die Funktion schlägt fehl, wenn sich der Thread bereits im Hintergrundverarbeitungsmodus befindet.

Windows Server 2003: Dieser Wert wird nicht unterstützt.

THREAD_MODE_BACKGROUND_END
0x00020000
Beenden sie den Hintergrundverarbeitungsmodus. Das System stellt die Ressourcenplanungsprioritäten des Threads wie vor dem Wechsel des Hintergrundverarbeitungsmodus wieder her.

Dieser Wert kann nur angegeben werden, wenn hThread ein Handle für den aktuellen Thread ist. Die Funktion schlägt fehl, wenn sich der Thread nicht im Hintergrundverarbeitungsmodus befindet.

Windows Server 2003: Dieser Wert wird nicht unterstützt.

THREAD_PRIORITY_ABOVE_NORMAL
1
Priorität 1 Punkt über der Prioritätsklasse.
THREAD_PRIORITY_BELOW_NORMAL
-1
Priorität 1 Punkt unterhalb der Prioritätsklasse.
THREAD_PRIORITY_HIGHEST
2
Priorität 2 Punkte über der Prioritätsklasse.
THREAD_PRIORITY_IDLE
-15
Basispriorität 1 für IDLE_PRIORITY_CLASS, BELOW_NORMAL_PRIORITY_CLASS, NORMAL_PRIORITY_CLASS, ABOVE_NORMAL_PRIORITY_CLASS oder HIGH_PRIORITY_CLASS Prozesse und eine Basispriorität von 16 für REALTIME_PRIORITY_CLASS Prozesse.
THREAD_PRIORITY_LOWEST
-2
Priorität 2 Punkte unterhalb der Prioritätsklasse.
THREAD_PRIORITY_NORMAL
0
Normale Priorität für die Prioritätsklasse.
THREAD_PRIORITY_TIME_CRITICAL
15
Basispriorität 15 für IDLE_PRIORITY_CLASS-, BELOW_NORMAL_PRIORITY_CLASS-, NORMAL_PRIORITY_CLASS-, ABOVE_NORMAL_PRIORITY_CLASS- oder HIGH_PRIORITY_CLASS-Prozesse und eine Basispriorität von 31 für REALTIME_PRIORITY_CLASS Prozesse.
 

Wenn der Thread über die REALTIME_PRIORITY_CLASS Basisklasse verfügt, kann dieser Parameter auch -7, -6, -5, -4, -3, 3, 4, 5 oder 6 sein. Weitere Informationen finden Sie unter Planungsprioritäten.

Rückgabewert

Wenn die Funktion erfolgreich ist, ist der Rückgabewert ungleich Null.

Wenn die Funktion fehlerhaft ist, ist der Rückgabewert null. Um erweiterte Fehlerinformationen zu erhalten, rufen Sie GetLastError auf.

Windows Phone 8.1: Windows Phone Store-Apps rufen diese Funktion möglicherweise auf, hat aber keine Auswirkung. Die Funktion gibt einen ungleichen Wert zurück, der den Erfolg angibt.

Hinweise

Jeder Thread verfügt über eine Basisprioritätsebene, die durch den Prioritätswert des Threads und die Prioritätsklasse des Prozesses bestimmt wird. Das System verwendet die Basisprioritätsebene aller ausführbaren Threads, um zu bestimmen, welcher Thread den nächsten Slice der CPU-Zeit erhält. Threads werden auf jeder Prioritätsebene im Roundrobin-Modus geplant, und nur wenn keine ausführbaren Threads auf einer höheren Ebene vorhanden sind, erfolgt die Planung von Threads auf einer niedrigeren Ebene.

Die SetThreadPriority-Funktion ermöglicht das Festlegen der Basisprioritätsebene eines Threads relativ zur Prioritätsklasse des Prozesses. Wenn Sie beispielsweise THREAD_PRIORITY_HIGHEST in einem Aufruf von SetThreadPriority für einen Thread eines IDLE_PRIORITY_CLASS-Prozesses angeben, wird die Basisprioritätsebene des Threads auf 6 festgelegt. Eine Tabelle mit den Basisprioritätsebenen für jede Kombination aus Prioritätsklasse und Threadprioritätswert finden Sie unter Planen von Prioritäten.

Bei IDLE_PRIORITY_CLASS, BELOW_NORMAL_PRIORITY_CLASS, NORMAL_PRIORITY_CLASS, ABOVE_NORMAL_PRIORITY_CLASS und HIGH_PRIORITY_CLASS Prozessen erhöht das System die Basisprioritätsebene eines Threads dynamisch, wenn Ereignisse auftreten, die für den Thread wichtig sind. REALTIME_PRIORITY_CLASS Prozesse erhalten keine dynamischen Boosts.

Alle Threads beginnen zunächst bei THREAD_PRIORITY_NORMAL. Verwenden Sie die Funktionen GetPriorityClass und SetPriorityClass , um die Prioritätsklasse eines Prozesses abzurufen und festzulegen. Verwenden Sie die GetThreadPriority-Funktion , um den Prioritätswert eines Threads abzurufen.

Verwenden Sie die Prioritätsklasse eines Prozesses, um zwischen Anwendungen zu unterscheiden, die zeitkritisch sind, und anwendungen, die normale oder unter normalen Planungsanforderungen liegen. Verwenden Sie Threadprioritätswerte, um die relativen Prioritäten der Aufgaben eines Prozesses zu unterscheiden. Beispielsweise könnte ein Thread, der eingaben für ein Fenster verarbeitet, eine höhere Prioritätsebene haben als ein Thread, der intensive Berechnungen für die CPU ausführt.

Achten Sie beim Bearbeiten von Prioritäten sehr darauf, dass ein Thread mit hoher Priorität nicht die gesamte verfügbare CPU-Zeit beansprucht. Ein Thread mit einer Basisprioritätsstufe über 11 beeinträchtigt den normalen Betrieb des Betriebssystems. Die Verwendung REALTIME_PRIORITY_CLASS kann dazu führen, dass Datenträgercaches nicht geleert werden, die Maus nicht mehr reagiert usw.

Die THREAD_PRIORITY_* -Werte wirken sich auf die CPU-Planungspriorität des Threads aus. Für Threads, die Hintergrundarbeiten wie Datei-E/A, Netzwerk-E/A oder Datenverarbeitung ausführen, reicht es nicht aus, die CPU-Planungspriorität anzupassen. selbst ein Thread mit cpu-Priorität im Leerlauf kann die Reaktionsfähigkeit des Systems bei Verwendung des Datenträgers und des Arbeitsspeichers leicht beeinträchtigen. Threads, die Hintergrundarbeiten ausführen, sollten die werte THREAD_MODE_BACKGROUND_BEGIN und THREAD_MODE_BACKGROUND_END verwenden, um ihre Ressourcenplanungsprioritäten anzupassen. Threads, die mit dem Benutzer interagieren, sollten nicht THREAD_MODE_BACKGROUND_BEGIN verwenden.

Wenn sich ein Thread im Hintergrundverarbeitungsmodus befindet, sollte die Freigabe von Ressourcen wie kritische Abschnitte, Heaps und Handles mit anderen Threads im Prozess minimiert werden, andernfalls können Prioritätsinversionen auftreten. Wenn Threads mit hoher Priorität ausgeführt werden, wird ein Thread im Hintergrundverarbeitungsmodus möglicherweise nicht sofort geplant, aber er wird nie verhungert.

Windows Server 2008 und Windows Vista: Während das System gestartet wird, gibt die SetThreadPriority-Funktion einen Erfolgsrückgabewert zurück, ändert jedoch nicht die Threadpriorität für Anwendungen, die über den Systemstartordner gestartet oder im Registrierungsschlüssel HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run aufgeführt sind. Diese Anwendungen werden für eine kurze Zeit (ca. 60 Sekunden) mit reduzierter Priorität ausgeführt, damit das System während des Startvorgangs besser auf Benutzeraktionen reagiert.

Windows 8.1 und Windows Server 2012 R2: Diese Funktion wird für Windows Store-Apps unterstützt.

Windows Phone 8.1:Windows Phone Store-Apps rufen diese Funktion möglicherweise auf, hat aber keine Auswirkung.

Beispiele

Im folgenden Beispiel wird die Verwendung des Threadhintergrundmodus veranschaulicht.

#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;
}

Anforderungen

Anforderung Wert
Unterstützte Mindestversion (Client) Windows XP [Desktop-Apps | UWP-Apps]
Unterstützte Mindestversion (Server) Windows Server 2003 [Desktop-Apps | UWP-Apps]
Zielplattform Windows
Kopfzeile processthreadsapi.h (einschließlich Windows.h unter Windows Vista, Windows 7, Windows Server 2008 Windows Server 2008 R2)
Bibliothek Kernel32.lib; WindowsPhoneCore.lib unter Windows Phone 8.1
DLL Kernel32.dll; KernelBase.dll am Windows Phone 8.1

Weitere Informationen

GetPriorityClass

GetThreadPriority

Prozess- und Threadfunktionen

Planungsprioritäten

SetPriorityClass

Threads