113 votes

Comment obtenir la durée, en milli's int et secondes float de <chrono> ?

J'essaie d'utiliser la bibliothèque chrono pour les minuteries et les durées.

Je veux être capable d'avoir un Duration frameStart; (depuis le début de l'application) et un Duration frameDelta; ( temps entre les images )

J'ai besoin d'être capable d'obtenir le frameDelta durée en millisecondes et en secondes flottantes.

Comment faire avec le nouveau c++11 ? <chrono> des bibliothèques ? J'ai travaillé dessus et j'ai cherché sur Google (les informations sont rares). Le code est fortement modélisé et nécessite des casts spéciaux et autres, je n'arrive pas à comprendre comment utiliser cette bibliothèque correctement.

180voto

Howard Hinnant Points 59526

Est-ce que c'est ce que vous cherchez ?

#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";
}

qui pour moi s'imprime :

6.5e-08s
0ms

28voto

Billy The Kid Points 281

Je devine ce que vous demandez. Je suppose que par "frame timer" en millisecondes, vous cherchez quelque chose qui agisse comme suit,

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

mais utilise std::chrono à la place,

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

J'espère que cela vous aidera.

17voto

Jonathan Wakely Points 45593

Je ne sais pas ce que signifient "millisecondes et secondes flottantes", mais cela devrait vous donner une idée :

#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';
}

10voto

Chris Drew Points 1743

En Style AAA en utilisant le idiome de l'initialisateur explicitement typé :

#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';
}

0voto

float GetTimeFloat() {
    return std::chrono::duration_cast<std::chrono::duration<float, std::milli>>(std::chrono::high_resolution_clock::now().time_since_epoch()).count() / 1000;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X