6
votes

Les threads sont-ils assez fiables pour calculer des secondes?

Je fais une application Android qu'à une activité montre une minuterie avec des heures et des secondes. À mesure que la valeur secondaire mettra à jour chaque seconde, je pensais faire un fil avec 1000 ms Sleep, après chaque cycle, il ajoutera 1 à secondes et mettra à jour la vue textuelle. En conséquence, il calculera des minutes et des heures et mettra à jour les vues de texte respectives.

Mais j'ai un doute à l'esprit, les threads sont-ils suffisamment fiables pour accomplir une telle tâche ou devrais-je utiliser la fonction de bibliothèque intégrée pour obtenir des secondes après chaque cycle? Je suis un peu préoccupé par l'obtention de ma minuterie de sonner de la synchronisation si je repose complètement sur le fil pour calculer le temps.


1 commentaires

Je dois donc appeler nouvelle datetime (). Getsecondofminute () après chaque cycle pour obtenir une valeur précise des secondes.


9 Réponses :


2
votes

Avec la logique que vous avez décrite, vous obtiendrez effectivement quelques dériver , c'est-à-dire que la petite erreur que vous puissiez obtenir chaque cycle s'ajoutera à une somme importante. Il est facilement corrigé cependant.

Gardez simplement une variable tenant l'heure de la dernière gâchette. Lorsque le sommeil est terminé, ajoutez 1000 au dernier temps de déclenchement, calculez le reste jusqu'à ce moment-là et dormez-le pendant que longtemps. De cette façon, vous pouvez obtenir le déclencheur tardif occasionnel, mais il sera rapidement corrigé.


0 commentaires

2
votes

thread dormir ne doit jamais être invoqué. Il ne garantit pas la différence d'heure exacte.

Je vous suggère d'utiliser une tâche de minuterie. Il est facile à utiliser et considérablement fiable.

bonne chance.


0 commentaires

8
votes

Dormir n'est pas assez bon.

Le sommeil mettra en pause le fil pendant un minimum de la période spécifiée, mais la période de sommeil réelle peut être plus longue que la durée spécifiée.


0 commentaires

1
votes

Mais j'ai un doute à l'esprit, sont assez fiables pour accomplir une telle tâche

Non, ils ne sont pas.

Vous pouvez utiliser un thread pour mettre à jour l'affichage de l'horloge, mais vous devez lire à nouveau System.Currenttimemillis () (ou similiar) à nouveau.


0 commentaires

1
votes

Pendant que si vous dites Dormir pendant 1 seconde, le fil dormira pendant 1 seconde, le temps réel à laquelle votre instruction a lieu lorsque le fil se réveille dépend d'autres facteurs tels que la planification du système d'exploitation et de la CPU. C'est peu probable qu'il aura un impact énorme, mais pourquoi ne gardez-vous pas simplement une trace des horodats réels afin de savoir exactement combien de temps s'est écoulé et correct en conséquence s'il y a une différence?

Vous pouvez utiliser quelque chose de simple comme système .Currenttimemillis ()


2 commentaires

C'est ce que je pensais. Je dois appeler une fonction de bibliothèque pour obtenir une valeur précise pendant les secondes chaque fois que le thread exécute.


Eh bien, sa partie de la norme Java et Android SDK ... Donc, lorsque vous dites une fonction de bibliothèque, bien que sa techniquement correcte, cela vient en partie et à colis avec la plate-forme.



3
votes

Dormir avec 1000 ms Delay est une mauvaise option, car il y a toujours une gigue et que quelque temps de CPU est également consacré à l'exécution de votre routine.

Je proposerais de tirer profit de planchedexecutetorservice.scheduleatfixedrate méthode, qui appellera votre mise en œuvre au taux fixe.


0 commentaires

6
votes

Utilisez Handler . ici 'SA Très bon message détaillé sur cela. < Pré> xxx

minuterie de démarrage - xxx

minuterie d'arrêt - xxx

sur pause- < / p> xxx


1 commentaires

La soustraction d'un point de départ fixe est la solution la plus robuste car elle n'est pas affectée par des problèmes de chronométrage. Même si le gestionnaire / le fil saute une invocation entière, votre minuterie sera correcte.



1
votes

Ce n'est pas possible avec un fil simple avec dormir dans Android. Il suffit d'utiliser un fil runnable.

Démarrez cela lorsque vous devez mettre à jour votre TextView en fonction de secondes. Dans ce que j'ai essayé avec des minutes, des secondes et des chiffres de millis3.

Vérifiez-le.

Créer un texte View, ND Définissez le texte avec le texte ci-dessous. xxx


0 commentaires

1
votes

Comme d'autres ont souligné, Sleep (Millis) ne garantit que pour dormir pour au moins la quantité de millisecondes - ce qui signifie que si vous utilisez 1000 au lieu d'un décalage, il sera à la traîne.

Utilisation avec décalage: xxx


0 commentaires