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
执行必须立即执行的时间关键任务的进程。 该进程的线程优先于普通或空闲优先级类进程的线程。 例如,无论操作系统上的负载如何,任务列表在用户调用时必须快速响应。 使用高优先级类时要格外小心,因为高优先级类应用程序几乎可以使用所有可用的 CPU 时间。
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。

注解

每个线程都有一个基本优先级级别,由线程的优先级值及其进程的优先级类确定。 系统使用所有可执行线程的基本优先级级别来确定哪个线程获取下一个 CPU 时间切片。 SetThreadPriority 函数允许设置线程相对于其进程的优先级类的基本优先级级别。 有关详细信息,请参阅 计划优先级

*_PRIORITY_CLASS值会影响进程的 CPU 计划优先级。 对于执行后台工作(如文件 I/O、网络 I/O 或数据处理)的进程,调整 CPU 计划优先级是不够的;使用磁盘和内存时,即使是空闲的 CPU 优先级进程也很容易干扰系统的响应能力。 执行后台工作的进程应使用 PROCESS_MODE_BACKGROUND_BEGINPROCESS_MODE_BACKGROUND_END 值来调整其资源计划优先级;与用户交互的进程不应使用 PROCESS_MODE_BACKGROUND_BEGIN

如果进程处于后台处理模式,则它创建的新线程也将处于后台处理模式。 当线程处于后台处理模式时,它应尽量减少与进程中的其他线程共享资源(例如关键部分、堆和句柄),否则可能会发生优先级反转。 如果有线程以高优先级执行,则后台处理模式下的线程可能不会立即计划,但永远不会被耗尽。

每个线程都可以使用 SetThreadPriority 独立进入后台处理模式。 进程中的线程调用 SetThreadPriority 进入后台处理模式后,请勿调用 SetPriorityClass 进入后台处理模式。 进程结束后台处理模式后,它会重置进程中的所有线程;但是,进程无法知道哪些线程已经处于后台处理模式。

示例

以下示例演示如何使用进程后台模式。

#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
标头 processthreadsapi.h (包括 Windows Server 2003 上的 Windows.h、Windows Vista、Windows 7、Windows Server 2008 Windows Server 2008 R2)
Library Kernel32.lib
DLL Kernel32.dll

另请参阅

CreateProcess

CreateThread

GetPriorityClass

GetThreadPriority

进程和线程函数

进程

计划优先级

SetThreadPriority