web-dev-qa-db-ja.com

<chrono>からintミリ秒と浮動秒数として期間を取得する方法は?

タイマーと期間にクロノライブラリを使用しようとしています。

Duration frameStart;(アプリの開始から)とDuration frameDelta;(フレーム間の時間)を持ちたい

frameDeltaの持続時間をミリ秒および浮動小数点の秒として取得できる必要があります。

新しいc ++ 11 <chrono>ライブラリを使用してこれをどのように行いますか?私はそれに取り組んでいて、グーグルで調べています(情報はまばらです)。コードはひどくテンプレート化されており、特別なキャストなどが必要です。このライブラリを正しく使用する方法がわかりません。

73
EddieV223

これはあなたが探しているものですか?

#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
125
Howard Hinnant

「ミリ秒とフロート秒」の意味がわかりませんが、これはあなたにアイデアを与えるはずです:

#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
Jonathan Wakely

あなたが求めているものを推測してください。ミリ秒のフレームタイマーで、次のように動作するものを探していると仮定しています。

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();
}

お役に立てれば。

11
Billy The Kid

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';
}
7
Chris Drew