Windows使用JobObject限制CPU使用率不能在所有计算机上正常运行

时间:2019-05-05 11:43:46

标签: c++ windows winapi cpu-usage

我正在使用JobObject限制进程的CPU使用率。我在运行Windows 10的两台计算机上运行我的代码,在一台计算机上它可以运行,但在另一台计算机上却不能运行,尽管所有WINAPI调用均成功返回。这是我的代码:

string jobName = "test_job";
HANDLE hJobObject = NULL;
hJobObject = CreateJobObject(NULL, jobName.c_str());
if (hJobObject == NULL) {
    return -1;
}

JOBOBJECT_CPU_RATE_CONTROL_INFORMATION cpuRateInfo; 
cpuRateInfo.ControlFlags = JOB_OBJECT_CPU_RATE_CONTROL_ENABLE | JOB_OBJECT_CPU_RATE_CONTROL_HARD_CAP;
cpuRateInfo.CpuRate = 10 * 100;
if (!SetInformationJobObject(hJobObject, JobObjectCpuRateControlInformation, &cpuRateInfo, sizeof(JOBOBJECT_CPU_RATE_CONTROL_INFORMATION))) {
    return -1;
}

HANDLE currentProcessHandle = GetCurrentProcess();
if (!AssignProcessToJobObject(hJobObject, currentProcessHandle)) {
    return -1;
}

任何想法导致此问题的原因是什么

1 个答案:

答案 0 :(得分:0)

您应该首先验证当前流程是否在现有作业控制下正常工作。

添加以下代码行:

BOOL bInJob = FALSE;
IsProcessInJob(GetCurrentProcess(),NULL,&bInJob);
if (bInJob)
{
    MessageBox(NULL,L"Process is in Job!",TEXT(""),MB_ICONINFORMATION | MB_OK);
    return 0;
}

由于进程属于一个作业对象,因此无法将其分配给另一个作业对象。

  

此外,在启用Windows的UAC系统中,   提示特权已添加到默认兼容性系统   JobObject,因此必须使用   CREATE_BREAKAWAY_FROM_JOB参数将流程与   默认JobObject

希望能为您提供帮助。