J'essaie d'enregistrer les millisecondes de temps écoulées sur une période donnée.
J'ai une classe comme celle-ci
void MyClass::func2CalledFromADifferentThread() { // after some time following line of code runs from a different thread auto end = high_resolution_clock::now(); m_elapsed = duration_cast<milliseconds>(end - m_start); std::cout << "Elapsed time in milliseconds is " << m_elapsed.count()/1000 << std::endl; }
J'ai 2 méthodes dans classe. L'un est appelé à partir de main qui est func1CalledFromMainThread
.
// Class methods using namespace std::chrono; void MyClass::func1CalledFromMainThread() { m_start = std::chrono::high_resolution_clock::now(); }
Et un autre qui est func2CalledFromADifferentThread
est appelé à partir d'un autre thread
// class member declarations class MyClass { std::chrono::high_resolution_clock::time_point m_start; std::chrono::system_clock::duration m_elapsed; };
Le Le problème est dans la journalisation cout
. Je vois que je dois diviser par 1000
pour obtenir des millisecondes de m_elapsed
. count
ne renvoie-t-il pas ici le nombre de std :: chrono :: millisecondes
? Pourquoi devrais-je diviser par 1000
ici? count ()
renvoie-t-il toujours en microsecondes
ou est-ce que je fais une erreur?
3 Réponses :
count
renvoie le nombre de graduations du type sur lequel vous l'appelez. Si vous écriviez ceci:
duration_cast<milliseconds>(end - m_start).count()
cela vous donnerait correctement le nombre de millisecondes. Cependant, vous ne stockez pas le résultat dans std :: chrono :: millisecondes
, vous le stockez dans std :: chrono :: system_clock :: duration
(le type de m_elapsed
). Par conséquent, m_elapsed.count ()
renvoie le nombre de ticks dans la fréquence de std :: chrono :: system_clock :: duration
, qui est probablement de l'ordre de quelques microsecondes sur votre plateforme.
En d'autres termes, vous annulez immédiatement la conversion en millisecondes
en stockant le résultat dans autre chose que millisecondes
.
p >
system_clock :: duration
et non en millisecondes
. Le problème dans votre cas est que std :: chrono :: system_clock :: duration
n'utilise pas la milliseconde car les ticks comptent.
Lors de l'exécution de cette ligne m_elapsed = duration_cast
,
Peu importe que vous convertissiez d'abord l'heure en milli
en utilisant une duration_cast
, le nombre de ticks sera toujours converti en system_clock :: duration
unité de durée qui se trouvent être microsecondes
.
Je déclarerais simplement m_elapsed
comme std :: chrono :: duration
et cela devrait fonctionner comme prévu.
J'ai rencontré un problème similaire et je l'ai résolu par un simple changement de:
auto m_elapsed;
à:
std::chrono::system_clock::duration m_elapsed;
Puisque vous accédez à
m_start
à partir de différents threads, vous devriez regarder dansstd :: mutex
.Voici un didacticiel vidéo
: youtube.com/watch? v = P32hvk8b13M@Angew. Oui, j'ai les mutex dans le code réel qui est beaucoup plus complexe que cet exemple. Je viens de créer un exemple de code pour discuter et comprendre le problème sans y impliquer trop de détails, ce qui a fonctionné je pense. Merci beaucoup pour la réponse utile