Windows ограничивает использование ЦП с помощью JobObject, который работает не на всех компьютерах - PullRequest
0 голосов
/ 05 мая 2019

Я использую JobObject, чтобы ограничить использование моего процессора. Я выполняю свой код на двух компьютерах под управлением 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 голосов
/ 06 мая 2019

Сначала необходимо убедиться, что текущий процесс работает под существующим контролем заданий.

Добавьте эти строки кода:

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.

Надеюсь вам помочь.

...