minuterie Cross plate-forme milliseconde qui dure plus de 49 jours?
-
24-09-2019 - |
Question
Je vais être le développement d'un petit serveur dédié en C / C ++ qui nécessite une disponibilité de toujours. J'ai cherché dans certaines fonctions de temps que le calendrier de milliseconde est nécessaire pour les calculs. J'ai 2 problèmes que je suis face à:
-
En utilisant un entier de 32 bits pour stocker le nombre de millisecondes depuis l'opération a commencé à s'enrouler autour d'environ après 49 jours la remise à zéro. J'ai pensé à utiliser 64 bits entiers, en utilisant gettimeofday pour récupérer microsecondes mais cela me amène à la deuxième partie.
-
Il ne semble pas y avoir de système standard appelle à obtenir millisecondes écoulées qui sont indépendants de la plate-forme
Que dois-je faire pour résoudre ces deux problèmes?
La solution
-
Utilisez un entier de 64 bits, en supposant que vous donne assez de temps
-
Vous avez raison; il n'y a pas de norme. Une possibilité serait d'utiliser le rel="nofollow Boost bibliothèque de DateTime , trouver un autre tour ou rouler votre propre.
Bonne chance!
Autres conseils
Comme cela a déjà été dit, le premier problème que vous allez affronter va obtenir une milliseconde précise du temps fiable.
Je dois admettre que je suis un peu par étapes la question cependant.
Je peux comprendre la nécessité d'un timing précis (niveau milliseconde, même microseconde), mais une synchronisation au niveau 50 jours milliseconde semble ... étrange.
Vous devriez peut-être revoir votre besoin en premier lieu, mais il est rare d'avoir besoin de plus de 6 ou 7 chiffres significatifs ... et je crains que vous essayez d'obtenir une taille leur convient tout objet durée.
Peut-être que vous devriez plutôt classer vos durées:
- quelques minutes à plus> utilisation de précision milliseconde
- autre> utiliser la deuxième précision (le fameux comte depuis le 1er janvier 1970)
Parce que ... quel est le sens de 1/10 de seconde à l'échelle de 2 mois?
. Utilisez des entiers 64 bits avec le code spécifique à la plateforme pour obtenir le nombre de millisecondes. Sur Unix, y compris Mac OS X, vous voulez gettimeofday
. Sous Windows, bonne chance d'obtenir une source de temps milliseconde granularité fiable; les dans la bibliothèque Tcl le faire est vraiment complexe car il y a quelques mauvaises gotchas dans la région.
réponse à 1: Si le « timing milliseconde » que vous mesurez est sous environ 20 jours, vous pouvez soustrayez les fois que les valeurs non signées et vérifier le résultat en tant que valeur signée. Cela devrait donner le bon résultat avec des minuteries d'emballage (emballage de 0xffffffff à 0x00000000). Si votre timing est plus de 20 jours, vous avez besoin de plus de bits.