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.
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 |