Как получить разницу в миллисекундах между временем запуска и now () в C ++? - PullRequest
0 голосов
/ 04 февраля 2020

Мой исходный код был

using n_time = std::chrono::high_resolution_clock;
n_time::time_point c_time = n_time::now();
n_time::time_point start = n_time::now();


auto gyro::duration(){
    return std::chrono::duration_cast<std::chrono::milliseconds>(c_time-start).count();
}

, но потом я понял, что хочу найти миллисекунды от начального аргумента до now(), и я не был уверен, что мой исходный код даст мне это , Итак, я попробовал

auto timeSince(n_time::time_point start) {
    n_time now = n_time::now();
    return std::chrono::duration_cast<std::chrono::milliseconds>(now - start).count();
}

Это как вы найдете миллисекунды после start? Я слышал, что есть функция с именем time_since_epoch(), и я не уверен, что ее лучше использовать вместо этого?

Эти часы предназначены для конкретной c функции робота, которую я пытаюсь написать, поэтому Мне нужно убедиться, что часы не вызывают ошибку преобразования:

void straight(int distance, int speed) { 
    int time = (distance / speed) * 1000; // milliseconds        
    while (timeSince() < time) {
        // code
    }
}

Функция duration() не выдает никаких ошибок в моей функции, но timeSince() дает мне ошибки преобразования, такие как

ошибка: преобразование из 'int' в нескалярный тип 'std :: chrono :: _ V2 :: system_clock :: time_point {aka std :: chrono :: time_point>

Ответы [ 2 ]

2 голосов
/ 05 февраля 2020

Если вы внимательно посмотрите на стандарт C ++, относящийся к std::chrono::high_resolution_clock, вы увидите, что он содержит тип члена std::chrono::high_resolution_clock::time_point, который эквивалентен std::chrono::time_point<std::chrono::high_resolution_clock>.

Помимо вышеуказанного типа члена, std::chrono::high_resolution_clock содержит функцию-член now, которая возвращает std::chrono::time_point<std::chrono::high_resolution_clock>, то есть std::chrono::high_resolution_clock::time_point, представляющее текущее значение часов.

В вашей функции у вас есть

n_time now = n_time::now();

то есть вы пытаетесь присвоить std::chrono::high_resolution_clock::time_point переменной типа std::chrono::high_resolution_clock, которая не звучит ясно, верно? Итак, вместо этого вы должны иметь

n_time::time_point now = n_time::now();

Вот полный код:

#include <chrono>
#include <iostream>

using n_time = std::chrono::high_resolution_clock;

auto timeSince(n_time::time_point start) {
    n_time::time_point now = n_time::now();
    return std::chrono::duration_cast<std::chrono::milliseconds>(now - start).count();
}

int main() {
    auto now = n_time::now() - std::chrono::seconds{3600};
    std::cout << timeSince(now) << std::endl;
    return 0;
}

И результат в миллисекундах:

3600000

ОБНОВЛЕНИЕ

Вот как вы можете использовать приведенный выше рабочий пример в вашем случае:

void straight(int distance, int speed) {
    auto start = n_time::now();

    // some time has passed since this function has started

    int time = (distance / speed) * 1000; // milliseconds        
    while (timeSince(start) < time) {
        // code
    }
}
1 голос
/ 04 февраля 2020

Я слышал, что есть функция под названием time_since_epoch (), и я не уверен, что будет лучше использовать вместо

Не совсем, см., Например, Когда используется стандарт :: chrono epoch? :

Существует де-факто (неофициальный) стандарт, согласно которому std :: chrono :: system_clock :: time_point имеет эпоху, совместимую с Unix Time. Это время, прошедшее с 00:00:00 по всемирному координированному времени (UT C), четверг, 1 января 1970 года, без учета високосных секунд.

Ошибка, которую вы видите генерируется этой строкой

n_time now = n_time::now();

Что должно быть

n_time::time_point now = n_time::now();
//    ^^^^^^^^^^^^

Учитывая using n_time = std::chrono::high_resolution_clock;

...