Поделиться через


Функция 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

Значение приоритета для потока. Этот параметр может принимать одно из указанных ниже значений.

Приоритет Значение
THREAD_MODE_BACKGROUND_BEGIN
0x00010000
Начните режим фоновой обработки. Система снижает приоритеты планирования ресурсов потока, чтобы он смог выполнять фоновую работу, не влияя на активность на переднем плане.

Это значение можно указать, только если hThread является дескриптором для текущего потока. Функция завершается сбоем, если поток уже находится в режиме фоновой обработки.

Windows Server 2003: Это значение не поддерживается.

THREAD_MODE_BACKGROUND_END
0x00020000
Завершение режима фоновой обработки. Система восстанавливает приоритеты планирования ресурсов потока, как это было до того, как поток перешел в режим фоновой обработки.

Это значение можно указать, только если hThread является дескриптором для текущего потока. Функция завершается сбоем, если поток не находится в фоновом режиме обработки.

Windows Server 2003: Это значение не поддерживается.

THREAD_PRIORITY_ABOVE_NORMAL
1
Приоритет на 1 пункт выше класса приоритета.
THREAD_PRIORITY_BELOW_NORMAL
-1
Приоритет на 1 пункт ниже класса приоритета.
THREAD_PRIORITY_HIGHEST
2
Приоритет на 2 пункта выше класса приоритета.
THREAD_PRIORITY_IDLE
-15
Базовый приоритет 1 для процессов IDLE_PRIORITY_CLASS, BELOW_NORMAL_PRIORITY_CLASS, NORMAL_PRIORITY_CLASS, ABOVE_NORMAL_PRIORITY_CLASS или HIGH_PRIORITY_CLASS и базовый приоритет 16 для процессов REALTIME_PRIORITY_CLASS .
THREAD_PRIORITY_LOWEST
-2
Приоритет 2 пункта ниже класса приоритета.
THREAD_PRIORITY_NORMAL
0
Обычный приоритет для класса priority.
THREAD_PRIORITY_TIME_CRITICAL
15
Базовый приоритет 15 для процессов IDLE_PRIORITY_CLASS, BELOW_NORMAL_PRIORITY_CLASS, NORMAL_PRIORITY_CLASS, ABOVE_NORMAL_PRIORITY_CLASS или HIGH_PRIORITY_CLASS и базовый приоритет 31 для процессов REALTIME_PRIORITY_CLASS .
 

Если поток имеет 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

См. также раздел

GetPriorityClass

GetThreadPriority

Функции процессов и потоков

Приоритеты планирования

SetPriorityClass

Потоки