Как установить приоритет процесса в C++
Я работаю над программой для сортировки данных, и мне нужно установить для процесса приоритет 31, который, я считаю, является наивысшим приоритетом процесса в Windows. Я провел некоторое исследование, но не могу понять, как это сделать в C++.
3 ответа
Вызов API Windows SetPriorityClass позволяет изменить приоритет процесса, см. Пример в документации MSDN и использовать REALTIME_PRIORITY_CLASS, чтобы установить самый высокий приоритет:
SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS)
Внимание: если вы запрашиваете истинный приоритет в реальном времени, вы получите его. Это ядерное оружие. ОС будет беспощадно расставлять приоритеты в приоритетном потоке в реальном времени, намного выше, чем даже обработка ввода на уровне ОС, очистка дискового кеша и другие высокоприоритетные задачи, критичные ко времени. Вы можете легко заблокировать всю вашу систему, если поток (ы) в реальном времени истощает ваш процессор. Будьте осторожны при этом, и, если в этом нет крайней необходимости, рассмотрите возможность использования высокоприоритетных. Дополнительная информация
Следующая функция сделает работу.
void SetProcessProirity(LPWSTR ProcessName, int Priority)
{
PROCESSENTRY32 proc32;
HANDLE hSnap;
if (hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0));
if (hSnap == INVALID_HANDLE_VALUE)
{
}
else
{
proc32.dwSize = sizeof(PROCESSENTRY32);
while ((Process32Next(hSnap, &proc32)) == TRUE)
{
if (_wcsicmp(proc32.szExeFile, ProcessName) == 0)
{
HANDLE h = OpenProcess(PROCESS_SET_INFORMATION ,TRUE, proc32.th32ProcessID);
SetPriorityClass(h, Priority);
CloseHandle(h);
}
}
CloseHandle(hSnap);
}
}
Например, чтобы установить приоритет Excel ниже обычного, используйте:
SetProcessProirity(L"excel.exe",BELOW_NORMAL_PRIORITY_CLASS)
После (или до) SetPriorityClass необходимо установить приоритет отдельного потока для достижения максимально возможного. Кроме того, для класса приоритета в реальном времени требуется еще один токен безопасности, поэтому обязательно захватите его (если он доступен). SetThreadPriority является вторичным API после SetPriorityClass.