setPriorityClass 函数 (processthreadsapi.h)
设置指定进程的优先级类。 此值与进程每个线程的优先级值一起确定每个线程的基本优先级级别。
语法
BOOL SetPriorityClass(
[in] HANDLE hProcess,
[in] DWORD dwPriorityClass
);
参数
[in] hProcess
进程的句柄。
句柄必须具有 PROCESS_SET_INFORMATION 访问权限。 有关详细信息,请参阅 进程安全性和访问权限。
[in] dwPriorityClass
进程的优先级类。 此参数的取值可为下列值之一:
返回值
如果该函数成功,则返回值为非零值。
如果函数失败,则返回值为零。 要获得更多的错误信息,请调用 GetLastError。
注解
每个线程都有一个基本优先级级别,由线程的优先级值及其进程的优先级类确定。 系统使用所有可执行线程的基本优先级级别来确定哪个线程获取下一个 CPU 时间切片。 SetThreadPriority 函数允许设置线程相对于其进程的优先级类的基本优先级级别。 有关详细信息,请参阅 计划优先级。
*_PRIORITY_CLASS值会影响进程的 CPU 计划优先级。 对于执行后台工作(如文件 I/O、网络 I/O 或数据处理)的进程,调整 CPU 计划优先级是不够的;使用磁盘和内存时,即使是空闲的 CPU 优先级进程也很容易干扰系统的响应能力。 执行后台工作的进程应使用 PROCESS_MODE_BACKGROUND_BEGIN 和 PROCESS_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 |