Я не знаю ни одного API, который бы заставлял планировщик ОС делать то, что вы хотите (даже если ваш поток имеет приоритет бездействия, если нет готовых потоков с более высоким приоритетом, ваш будет работать). Тем не менее, я думаю, что вы можете импровизировать довольно элегантную функцию регулирования на основе того, что вы уже делаете. По сути (у меня нет удобной машины для Windows):
Выберите количество по умолчанию, в течение которого поток будет спать каждую итерацию. Затем на каждой итерации (или на каждой n-й итерации, когда функция регулирования сама по себе не становится значительной загрузкой ЦП),
- Вычисляет количество процессорного времени, использованного вашим потоком с момента последнего вызова функции регулирования (я назову этот dCPU). Вы можете использовать API GetThreadTimes () , чтобы узнать, сколько времени выполнялся ваш поток.
- Вычисляет количество реального времени, прошедшего с момента последнего вызова функции регулирования (я назову этот dClock).
- dCPU / dClock - процент использования ЦП (одного ЦП). Если оно выше, чем вы хотите, увеличьте время сна, если ниже, уменьшите время сна.
- Дайте вашей нити спать в течение вычисленного времени.
В зависимости от того, как ваш сторожевой таймер вычисляет загрузку процессора, вы можете использовать GetProcessAffinityMask () , чтобы узнать, сколько процессоров имеет система. dCPU / (dClock * CPU) - это процент общего доступного времени CPU.
Вам все равно придется выбирать магические числа для начального времени ожидания и величины увеличения / уменьшения, но я думаю, что этот алгоритм можно настроить так, чтобы поток работал на довольно близком уровне к определенному проценту ЦП.