【问题标题】:Windows limit CPU usage using JobObject not working on all computersWindows 使用 JobObject 限制 CPU 使用率,但不适用于所有计算机
【发布时间】:2019-05-05 11:43:46
【问题描述】:

我正在使用 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;
}

知道是什么导致了这个问题吗?

【问题讨论】:

  • 澄清你所说的不工作是什么意思。是否限制在小于或大于 10%,或者根本不限制?
  • 完全没有限制

标签: c++ windows winapi cpu-usage


【解决方案1】:

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

添加这几行代码:

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

希望能帮到你。

【讨论】:

  • 问题与 Windows 10 系统有关。 Windows 8 及更高版本允许嵌套作业。
猜你喜欢
  • 2023-04-08
  • 1970-01-01
  • 2022-09-28
  • 1970-01-01
  • 2012-06-13
  • 1970-01-01
  • 1970-01-01
  • 2010-10-01
  • 1970-01-01
相关资源
最近更新 更多