2017-10-01 4 views
1

Je suis en train de mettre en œuvre un chronomètre pour le débogage comme suit:C++ std débordement chrono

#include <chrono> 

namespace sbstd 
{ 
    class timer 
    { 
    private: 
     bool m_running = false; 
     std::chrono::time_point<std::chrono::system_clock> m_temp; 
     std::chrono::nanoseconds m_time; 
    public: 
     void start() 
     { 
      if (m_running) { throw std::exception("timer already running"); } 
      m_temp = std::chrono::system_clock::now(); 
      m_running = true; 
     } 

     void stop() 
     { 
      if (!m_running) { throw std::exception("timer not started"); } 
      m_time += std::chrono::system_clock::now() - m_temp; 
      m_running = false; 
     } 

     long long get_ms() const 
     { 
      return std::chrono::duration_cast<std::chrono::milliseconds>(m_time).count(); 
     } 
    }; 
} 

Dans la principale méthode que je donne les résultats suivants:

sbstd::timer t1; 
t1.start(); 
std::this_thread::sleep_for(std::chrono::seconds(5)); 
t1.stop(); 
cout << t1.get_ms(); 

au lieu de 5000 je reçois un int négatif .

Qu'est-ce qui ne va pas?

+0

Quelle est la valeur initiale de 'm_time'? Quand et où le réinitialisez-vous? –

Répondre

1

m_timem_time n'est pas initialisé, donc sa valeur est indéterminée - c'est juste une valeur de déchet. Vous voulez probablement l'initialiser à 0 - utilisez std::chrono::nanoseconds::zero(). Here il est en action.

+0

Quand je fais cela, il me dit "std :: chrono :: duration": l'utilisation du template de classe nécessite une liste d'arguments "Je peux le faire avec un constructeur. Savez-vous pourquoi votre code ne compile pas sur VS2017? –

+0

Désolé! Je l'ai déjà corrigé dans mon édition. – Mark

+0

qui l'a fait, merci –