Если это вообще возможно, я рекомендую использовать <chrono>
, так как во время компиляции вы поймете так много ошибок и упростите логи c.
Далее я рекомендую комбинацию использования ОС для сна и "горячий сон". Короче говоря, используйте ОС для сна до некоторого короткого интервала до желаемого времени пробуждения, а затем вращайтесь в течение последнего небольшого интервала времени. Я использую 1 мс для последнего интервала вращения, мммм.
#include <chrono>
#include <iostream>
#include <thread>
void
SleepShort(std::chrono::duration<float, std::milli> d)
{
using namespace std::chrono;
auto t = steady_clock::now() + ceil<steady_clock::duration>(d);
if (d > 1ms)
std::this_thread::sleep_until(t-1ms);
while (steady_clock::now() < t)
;
}
Одна ошибка, с которой я столкнулся при разработке кода выше, избегала отсутствия необходимой точности в float
. У меня изначально был такой код:
auto t = steady_clock::now() + d;
, который неявно создает time_point
с rep
из float
и периодом nanoseconds
, измеряющим время, прошедшее с момента загрузки компьютера (на моей платформе). ). Оказывается, что float
не обладает точностью, необходимой для представления этой величины. Впоследствии мой спин l oop не работал.
Переключение на ceil
, как показано, преобразует миллисекунды с плавающей запятой в целочисленные тики, которые использует steady_clock
(nanoseconds
во всех 3 основных реализациях), и теперь арифметика c имеет достаточную точность для правильной работы. Fwiw, double
также работал бы нормально.
Это можно назвать так:
SleepShort(2.5ms);