Chrono timer ne convertissant pas les secondes correctement

Je rencontre un problème intéressant, mais étrange, avec mon chronomètre. Il semble que les millisecondes fonctionnent très bien. Cependant, lorsque j’essaie d’appliquer la dissortingbution std::chrono::seconds , j’obtiens soudainement 0.000000 lors de la conversion en float.

Ma timer est la suivante:

  #include  #include  #include  class Timer { public: typedef std::chrono::high_resolution_clock Time; typedef std::chrono::milliseconds ms; //<--If changed to seconds, I get 0.00000 typedef std::chrono::duration fsec; std::chrono::high_resolution_clock::time_point m_timestamp; float currentElapsed; Timer() { m_timestamp = Time::now(); } float getTimeElapsed() { return currentElapsed; } void Tick() { currentElapsed = std::chrono::duration_cast(Time::now() - m_timestamp).count(); m_timestamp = Time::now(); } public: //Singleton stuff static Timer* Instance(); static void Create(); }; 

La timer est cochée une fois par image. Ainsi, par exemple, je reçois normalement environ 33 ms par image. 33ms / 1000 = 0.033s seconde, il devrait donc y avoir beaucoup d’espace de bits pour tenir cela.

Des idées sur ce qui se passe peut-être?

Toute aide est grandement appréciée!

EDIT: Désolé, secondes, pas millisecondes

std::chrono::seconds et al. sont tous spécifiés pour avoir des représentations intégrales (C ++ 11 §20.11.2 [time.syn]). Lorsque vous convertissez une durée haute résolution en une durée basse résolution, vous effectuez une division entière avec troncature, par exemple:

 using namespace std::chrono; assert(duration_cast(milliseconds{999}) == seconds{0}); 

Vous pouvez éviter cette troncature en basculant sur une représentation en virgule flottante avant la mise à l’échelle plutôt qu’après :

 using namespace std::chrono; currentElapsed = duration_cast>(Time::now() - m_timestamp).count(); 

( Démo au coliru )

Mieux encore, stockez currentElapsed comme duration pour conserver les “unités” associées à la magnitude :

 class Timer { typedef std::chrono::high_resolution_clock Time; typedef std::chrono::duration duration; Time::time_point m_timestamp; duration currentElapsed; public: Timer() : m_timestamp(Time::now()) {} duration getTimeElapsed() const { return currentElapsed; } void Tick() { auto now = Time::now(); currentElapsed = now - m_timestamp; m_timestamp = now; } };