Причина, по которой он использует 15-20% ЦП, скорее всего, потому что он использует 100% на одном ядре, поскольку в этом нет ничего, что могло бы замедлить его работу.
В общем, это "сложная" проблема решать как ПК (точнее, ОС, работающие на этих ПК), как правило, не предназначены для запуска приложений реального времени. Если это абсолютно желательно, вам следует изучить ядра и операционные системы реального времени.
По этой причине гарантия, которая обычно дается в периоды сна, заключается в том, что система будет находиться в спящем режиме по крайней мере . указанное количество времени.
Если вы используете Linux, вы можете попробовать использовать метод nanosleep
(http://man7.org/linux/man-pages/man2/nanosleep.2.html), хотя у меня нет никакого опыта с ним.
В качестве альтернативы вы могли бы go с гибридным подходом, где вы используете режимы сна для длительных задержек, но переключитесь на опрос, когда почти время:
#include <thread>
#include <chrono>
using namespace std::chrono_literals;
...
wantedtime = currentTime / timerResolution + ms;
currentTime = 0;
while(currentTime < wantedTime)
{
QueryPerformanceCounter((LARGE_INTEGER*)¤tTime);
currentTime /= timerResolution;
if(currentTime-wantedTime > 100) // if waiting for more than 100 ms
{
//Sleep for value significantly lower than the 100 ms, to ensure that we don't "oversleep"
std::this_thread::sleep_for(50ms);
}
}
Теперь это склонно к небольшому состоянию гонки, поскольку предполагается, что ОС вернет управление программой в течение 50 мс после выполнения sleep_for. Для дальнейшей борьбы с этим вы можете выключить его (скажем, спать 1 мс).