C ++ Сравнить часы с высоким разрешением с фиксированным номером - PullRequest
0 голосов
/ 24 ноября 2018

Я работаю над эмулятором и не понимаю, как сравнить прошедшее время, измеренное с библиотекой 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>' не делаетопределить этот оператор или преобразование в тип, приемлемый для предопределенного оператора

Ответы [ 2 ]

0 голосов
/ 24 ноября 2018

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 дает вам.

0 голосов
/ 24 ноября 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))
...