С++ Сравните часы с высоким разрешением с фиксированным числом

Я работаю над эмулятором и не понимаю, как сравнить прошедшее время, измеренное с помощью библиотеки chrono, с фиксированным числом, например (CPUCycles * 0.0000005).

Что-то типа

auto lastTime = std::chrono::steady_clock::now();
while (condition)
{
    if ((std::chrono::steady_clock::now() - lastTime) >= (CPUCycles * 0.0000005))
    {
        //do something;
    }
    else
    {
        //do something else;
    }
}

что на данный момент дает мне ошибку

Двоичный код ошибки C2676 '>=': 'std::chrono::duration‹__int64,std::nano>' не определяет этот оператор или преобразование в тип, приемлемый для предопределенного оператора


person Francesco    schedule 24.11.2018    source источник


Ответы (2)


std::chrono::steady_clock::now() - lastTime возвращает duration, поэтому вам нужно сравнить его с длительностью. Что это означает, зависит от того, что означает ваше значение по сравнению с. Лучший/правильный способ - преобразовать это в продолжительность.

Итак, ваш CPUCycles * 500 возвращает продолжительность в наносекундах? (0.0000005 == 500e-9) Затем сообщите компилятору, что:

if ((std::chrono::steady_clock::now() - lastTime) >= CPUCycles * std::chrono::nanoseconds(500))

Видите, как четко это передает смысл? На каждые 500 нс приходится 1 цикл -> Таким образом, ваше прошедшее время равно CPUCycles, умноженному на это.

Альтернативой является получение подсчета длительности с помощью функции-члена count(), но в основном вам нужно сначала указать длительность:

auto diff = std::chrono::steady_clock::now() - lastTime;
if(std::chrono::duration_cast<std::chrono::nanoseconds>(diff).count() >= CPUCycles * 500) ...

Но это теряет всю ясность, которую дает вам chrono.

person Flamefire    schedule 24.11.2018
comment
Большое спасибо, это работает, но я не могу понять, как это возможно, чтобы условие всегда было истинным. Условие исправлено для скорости Intel 8080 2 МГц по сравнению с моим Intel Core i3. - person Francesco; 24.11.2018
comment
Вы устанавливаете lastTime в //do something на текущее время? Если нет, это ваша ошибка, иначе нам нужно больше кода (лучше всего в отдельном вопросе) - person Flamefire; 24.11.2018
comment
Я нашел проблему. cout занимает некоторое время и печатать на видео, когда условие истинно, а когда ложно, невозможно. Но если я поочередно прокомментирую один cout, я увижу оба - person Francesco; 24.11.2018

Разница между двумя объектами time_point заключается в duration, которые не могут быть легко преобразованы из любого числа. Вы должны явно построить правильный объект продолжительности.

Есть несколько стандартных псевдонимов длительности, например std::chrono::nanoseconds, которые вы можете использовать как std::chrono::nanoseconds(500):

if ((std::chrono::steady_clock::now() - lastTime) >= (CPUCycles * std::chrono::nanoseconds(500)))

Или, если вы используете пространство имен std::literals::chrono_literals, вы можете использовать литерал определения "user" ns:

if ((std::chrono::steady_clock::now() - lastTime) >= (CPUCycles * 500ns))
person Some programmer dude    schedule 24.11.2018