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


Функция SetPriorityClass (processthreadsapi.h)

Задает класс приоритета для указанного процесса. Это значение вместе со значением приоритета каждого потока процесса определяет базовый уровень приоритета каждого потока.

Синтаксис

BOOL SetPriorityClass(
  [in] HANDLE hProcess,
  [in] DWORD  dwPriorityClass
);

Параметры

[in] hProcess

Дескриптор процесса.

Дескриптор должен иметь право доступа к PROCESS_SET_INFORMATION . Дополнительные сведения см. в разделе Управление правами на доступ и безопасность процесса.

[in] dwPriorityClass

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

Приоритет Значение
ABOVE_NORMAL_PRIORITY_CLASS
0x00008000
Процесс с приоритетом выше NORMAL_PRIORITY_CLASS , но ниже HIGH_PRIORITY_CLASS.
BELOW_NORMAL_PRIORITY_CLASS
0x00004000
Процесс с приоритетом выше IDLE_PRIORITY_CLASS , но ниже NORMAL_PRIORITY_CLASS.
HIGH_PRIORITY_CLASS
0x00000080
Процесс, выполняющий критические по времени задачи, которые должны быть выполнены немедленно. Потоки процесса выгружают потоки процессов с нормальными или низкими приоритетами. Например, список задач, который должен быстро реагировать при вызове пользователем независимо от нагрузки на операционную систему. Будьте внимательны при использовании класса с высоким приоритетом, так как приложение класса с высоким приоритетом может использовать почти все доступное время ЦП.
IDLE_PRIORITY_CLASS
0x00000040
Процесс, потоки которого выполняются только в том случае, если система простаивает. Потоки данного процесса выгружаются потоками любых процессов с более высоким приоритетом. Примером может быть экранная заставка. Класс с приоритетом простоя наследуется дочерними процессами.
NORMAL_PRIORITY_CLASS
0x00000020
Процесс без особых потребностей в планировании.
PROCESS_MODE_BACKGROUND_BEGIN
0x00100000
Запуск режима фоновой обработки. Система снижает приоритеты планирования ресурсов процесса (и его потоков), чтобы можно было выполнять фоновую работу, не влияя на активность на переднем плане.

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

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

PROCESS_MODE_BACKGROUND_END
0x00200000
Завершение режима фоновой обработки. Система восстанавливает приоритеты планирования ресурсов процесса (и его потоков), как они были до того, как процесс перешел в режим фоновой обработки.

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

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

REALTIME_PRIORITY_CLASS
0x00000100
Процесс, имеющий наивысший возможный приоритет. Потоки процесса вытесняют потоки всех остальных процессов, включая процессы операционной системы, выполняющие важные задачи. Например, процесс в режиме реального времени, который выполняется более чем за короткий интервал, может привести к тому, что кэши диска не будут очищаться или мышь перестает отвечать на запросы.

Возвращаемое значение

Если функция выполняется успешно, возвращается ненулевое значение.

Если функция выполняется неудачно, возвращается нулевое значение. Дополнительные сведения об ошибке можно получить, вызвав GetLastError.

Комментарии

Каждый поток имеет базовый уровень приоритета, определяемый значением приоритета потока и классом приоритета его процесса. Система использует базовый уровень приоритета всех исполняемых потоков, чтобы определить, какой поток получает следующий срез времени ЦП. Функция SetThreadPriority позволяет задать базовый уровень приоритета потока относительно класса приоритета его процесса. Дополнительные сведения см. в разделе Приоритеты планирования.

Значения *_PRIORITY_CLASS влияют на приоритет планирования ЦП процесса. Для процессов, выполняющих фоновую работу, например файловый ввод-вывод, сетевой ввод-вывод или обработку данных, недостаточно настроить приоритет планирования ЦП; Даже процесс приоритета простоя ЦП может легко помешать быстродействию системы при использовании диска и памяти. Процессы, выполняющие фоновую работу, должны использовать значения PROCESS_MODE_BACKGROUND_BEGIN и PROCESS_MODE_BACKGROUND_END для корректировки приоритетов планирования ресурсов; Процессы, взаимодействующие с пользователем, не должны использовать PROCESS_MODE_BACKGROUND_BEGIN.

Если процесс находится в фоновом режиме обработки, новые потоки, которые он создает, также будут находиться в режиме фоновой обработки. Когда поток находится в фоновом режиме обработки, он должен свести к минимуму общий доступ к ресурсам, таким как критические разделы, кучи и дескрипторы, с другими потоками в процессе, в противном случае могут возникнуть инверсии приоритета. Если потоки выполняются с высоким приоритетом, поток в режиме фоновой обработки может быть не запланирован быстро, но он никогда не будет голодать.

Каждый поток может переходить в режим фоновой обработки независимо с помощью SetThreadPriority. Не вызывайте Метод SetPriorityClass для входа в режим фоновой обработки после того, как поток в процессе вызвал SetThreadPriority , чтобы перейти в режим фоновой обработки. После завершения фонового режима обработки процесс сбрасывает все потоки в процессе; однако процесс не может узнать, какие потоки уже находились в фоновом режиме обработки.

Примеры

В следующем примере показано использование фонового режима процесса.

#include <windows.h>
#include <tchar.h>

int main( void )
{
   DWORD dwError, dwPriClass;

   if(!SetPriorityClass(GetCurrentProcess(), PROCESS_MODE_BACKGROUND_BEGIN))
   {
      dwError = GetLastError();
      if( ERROR_PROCESS_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 priority class

   dwPriClass = GetPriorityClass(GetCurrentProcess());

   _tprintf(TEXT("Current priority class is 0x%x\n"), dwPriClass);

   //
   // Perform background work
   //
   ;

   if(!SetPriorityClass(GetCurrentProcess(), PROCESS_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 Server 2003, Windows Vista, Windows 7, Windows Server 2008 Windows Server 2008 R2)
Библиотека Kernel32.lib
DLL Kernel32.dll

См. также

CreateProcess

CreateThread

GetPriorityClass

GetThreadPriority

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

Процессы

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

SetThreadPriority