Как получить длительность, в виде целых миль и секунд с плавающей точкой из & lt; chrono & gt ;?

Я пытаюсь использовать хронографическую библиотеку для таймеров и длительностей.

Я хочу иметь возможность иметь Duration frameStart; (с самого начала приложения)
и Duration frameDelta; (время между кадрами)

Я должен быть в состоянии получить frameDelta длительность в виде миллисекунд и секунд с плавающей точкой.

Как вы делаете это с новым C ++ 11 <chrono> библиотеки? Я работал над этим и гуглил (информация скудная). Код сильно шаблонизирован и требует специальных приведения и тому подобного, я не могу понять, как правильно использовать эту библиотеку.

63

Решение

Это то, что вы ищете?

#include <chrono>
#include <iostream>

int main()
{
typedef std::chrono::high_resolution_clock Time;
typedef std::chrono::milliseconds ms;
typedef std::chrono::duration<float> fsec;
auto t0 = Time::now();
auto t1 = Time::now();
fsec fs = t1 - t0;
ms d = std::chrono::duration_cast<ms>(fs);
std::cout << fs.count() << "s\n";
std::cout << d.count() << "ms\n";
}

который для меня распечатывает:

6.5e-08s
0ms
114

Другие решения

Я не знаю, что означают «миллисекунды и секунды с плавающей запятой», но это должно дать вам представление:

#include <chrono>
#include <thread>
#include <iostream>

int main()
{
auto then = std::chrono::system_clock::now();
std::this_thread::sleep_for(std::chrono::seconds(1));
auto now = std::chrono::system_clock::now();
auto dur = now - then;
typedef std::chrono::duration<float> float_seconds;
auto secs = std::chrono::duration_cast<float_seconds>(dur);
std::cout << secs.count() << '\n';
}
14

Догадайся, о чем ты просишь. Я предполагаю, что с точностью до миллисекундного кадра вы ищете что-то, что действует следующим образом:

double mticks()
{
struct timeval tv;
gettimeofday(&tv, 0);
return (double) tv.tv_usec / 1000 + tv.tv_sec * 1000;
}

но использует std::chrono вместо,

double mticks()
{
typedef std::chrono::high_resolution_clock clock;
typedef std::chrono::duration<float, std::milli> duration;

static clock::time_point start = clock::now();
duration elapsed = clock::now() - start;
return elapsed.count();
}

Надеюсь это поможет.

10

В AAA стиль с использованием идиома явно инициализированного инициализатора:

#include <chrono>
#include <iostream>

int main(){
auto start = std::chrono::high_resolution_clock::now();
// Code to time here...
auto end = std::chrono::high_resolution_clock::now();

auto dur = end - start;
auto i_millis = std::chrono::duration_cast<std::chrono::milliseconds>(dur);
auto f_secs = std::chrono::duration_cast<std::chrono::duration<float>>(dur);
std::cout << i_millis.count() << '\n';
std::cout << f_secs.count() << '\n';
}
6