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