Правильный способ сделать это - вызвать SetProcessPriorityClass с PROCESS_BACKGROUND_MODE_BEGIN для запуска фонового режима. Это вызывает очень низкий (фоновый) приоритет ввода / вывода и приоритет CPU в режиме ожидания. Когда закончите, снова вызовите SetProcessPriorityClass, предоставив PROCESS_BACKGROUND_MODE_END . То же самое можно сделать на уровне потока с помощью SetThreadPriority и THREAD_BACKGROUND_MODE_BEGIN / END.
Если вы хотите напрямую установить приоритет ввода-вывода, независимо от приоритета ЦП, вы должны использовать собственные API-интерфейсы NT. Я задокументировал это здесь , но не включал примеры кода, поскольку мы все знаем, что они дословно разорваны.
Требуемый API - это собственный API NT NtSetInformationProcess . Используя этот API, вы можете изменить приоритет ввода / вывода. Этот API принимает переменную класса, сообщающую ему, какой тип информации о процессе вы хотите изменить, эта переменная класса должна быть установлена в ProcessIoPriority. Затем вы можете установить приоритет ввода / вывода всего процесса следующим образом.
Аналогично, приоритет ввода / вывода можно получить с помощью NtQueryInformationProcess .
Плохая новость заключается в том, что уровни приоритета немного ограничены. Критическое зарезервировано для операций подкачки системы. Это оставляет вас с Normal и Very Low (Background). Низкие и Высокие могут быть или не быть реализованы в более новых выпусках Windows. Кажется, что есть частичная поддержка, по крайней мере.
Если у вас нет опыта работы с собственными API-интерфейсами NT, первое, что нужно сделать, это понять их. Как только вы это сделаете, вы увидите, что это так же просто, как один вызов API.