std :: chrono :: milliseconds .count () возвращает в микросекундах? - PullRequest
0 голосов
/ 21 января 2019

Я пытаюсь записать миллисекунды времени, прошедшего за определенный период времени.

У меня есть такой класс

// class member declarations
class MyClass {

    std::chrono::high_resolution_clock::time_point   m_start;
    std::chrono::system_clock::duration              m_elapsed;
};

У меня есть 2 метода в классе. Один вызывается из основного, то есть func1CalledFromMainThread.

// Class methods
using namespace std::chrono;
void MyClass::func1CalledFromMainThread() {

    m_start = std::chrono::high_resolution_clock::now();
}

И еще один, который func2CalledFromADifferentThread вызывается из другого потока

void MyClass::func2CalledFromADifferentThread() {

    // after some time following line of code runs from a different thread
    auto end = high_resolution_clock::now();

    m_elapsed = duration_cast<milliseconds>(end - m_start);
    std::cout << "Elapsed time in milliseconds is " << m_elapsed.count()/1000 << std::endl;
}

Проблема в журнале cout. Я вижу, что мне нужно разделить на 1000, чтобы получить миллисекунды из m_elapsed. Разве count здесь не возвращает счет std::chrono::milliseconds? Почему я должен делить на 1000 здесь? count() всегда возвращается в microseconds или я делаю ошибку?

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Вы сохраняете длительность, используя system_clock::duration единицы, а не в milliseconds.

Проблема в вашем случае заключается в том, что std::chrono::system_clock::duration не использует миллисекунды в качестве отсчетов тиков.При выполнении этой строки m_elapsed = duration_cast<milliseconds>(end - m_start);, независимо от того, что вы сначала конвертируете время в milli, используя duration_cast, количество тиков всегда будет конвертировано в system_clock::duration единицу продолжительности, которая равна microseconds.

Я бы просто объявил m_elapsed как std::chrono::duration<long, std::milli>, и он должен работать как положено.

0 голосов
/ 21 января 2019

count возвращает количество тиков того типа, на котором вы его вызываете.Если бы вы написали это:

duration_cast<milliseconds>(end - m_start).count()

, это даст вам правильное количество миллисекунд.Однако вы сохраняете результат не в std::chrono::milliseconds, а в std::chrono::system_clock::duration (тип m_elapsed).Следовательно, m_elapsed.count() возвращает количество тиков на частоте std::chrono::system_clock::duration, которое, вероятно, составляет микросекунды на вашей платформе.

Другими словами, вы немедленно отменяете приведение к milliseconds, сохраняярезультат, отличный от milliseconds.

...