Функция 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 могут вызывать эту функцию, но она не оказывает никакого влияния. Функция возвращает ненулевое значение, указывающее на успешное выполнение.
Комментарии
Каждый поток имеет базовый уровень приоритета, определяемый значением приоритета потока и классом приоритета его процесса. Система использует базовый уровень приоритета всех исполняемых потоков, чтобы определить, какой поток получает следующий срез времени ЦП. Потоки планируются с циклическим перебором на каждом уровне приоритета, и только если нет исполняемых потоков на более высоком уровне, выполняется планирование потоков на более низком уровне.
Функция SetThreadPriority позволяет задать базовый уровень приоритета потока относительно класса приоритета его процесса. Например, при указании THREAD_PRIORITY_HIGHEST в вызове SetThreadPriority для потока процесса IDLE_PRIORITY_CLASS базовый уровень приоритета потока устанавливается равным 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 , чтобы получить значение приоритета потока.
Используйте класс приоритета процесса, чтобы различать приложения, которые являются критически важными по времени, и приложениями, которые имеют обычные или ниже обычных требований к планированию. Используйте значения приоритета потока, чтобы различать относительные приоритеты задач процесса. Например, поток, обрабатывающий входные данные для окна, может иметь более высокий уровень приоритета, чем поток, выполняющий интенсивные вычисления для ЦП.
При управлении приоритетами будьте очень осторожны, чтобы поток с высоким приоритетом не потреблял все доступное время ЦП. Поток с базовым уровнем приоритета выше 11 мешает нормальной работе операционной системы. Использование REALTIME_PRIORITY_CLASS может привести к тому, что кэши дисков не будут очищаться, мышь перестанет отвечать на запросы и т. д.
Значения THREAD_PRIORITY_* влияют на приоритет планирования ЦП потока. Для потоков, выполняющих фоновую работу, например файловый ввод-вывод, сетевой ввод-вывод или обработку данных, недостаточно настроить приоритет планирования ЦП; даже поток приоритета простоя ЦП может легко повлиять на скорость отклика системы при использовании диска и памяти. Потоки, выполняющие фоновую работу, должны использовать значения 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 приложения Магазина могут вызывать эту функцию, но она не оказывает никакого влияния.
Примеры
В следующем примере показано использование фонового режима потока.
#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 |
Header | processthreadsapi.h (включая Windows.h в Windows Vista, Windows 7, Windows Server 2008 Windows Server 2008 R2) |
Библиотека | Kernel32.lib; WindowsPhoneCore.lib в Windows Phone 8.1 |
DLL | Kernel32.dll; KernelBase.dll Windows Phone 8.1 |