Question

Je veux afficher l'heure (y compris les secondes) dans une application dans un champ de texte, assez simple. Ce que je fais actuellement est de créer un NSTimer qui passe toutes les 0,1 secondes qui obtient le temps du système et met à jour le champ de texte. Cela semble être une façon terriblement inefficace pour ce faire. Y at-il une meilleure façon?

Était-ce utile?

La solution

Êtes-vous affichiez à la résolution du dixième de-seconde (ou plus fin)?

Si oui, je ne vois aucun problème. , Vote suce généralement parce que ce que vous vérifiez pourrait ne pas avoir changé, mais il est pas comme le temps va arrêter sur vous. Ainsi, un dixième de-seconde minuterie est très bien.

Sinon, créez une minuterie dont l'intervalle est la résolution désirée, puis obtenir sa date de feu, autour d'elle jusqu'à la résolution souhaitée (par exemple, un second ensemble si vous mettez à jour toutes les secondes) et définissez que la nouvelle date d'incendie . Ensuite, votre minuterie ne par hasard le feu avec le temps, il est approprié de mettre à jour votre point de vue de l'horloge.

Notez que si le temps se déplace toujours, il ne se déplace pas toujours linéaire: il peut sauter en avant ou vers l'arrière d'une heure ou une demi-heure, ou un montant si l'utilisateur (ou ntpd) modifie le réglage de l'horloge du système. Sous Mac OS X 10.6 et versions ultérieures, vous pouvez observer la NSSystemClockDidChangeNotification et réajustez la date d'incendie de votre minuterie lorsque cela se produit.

Autres conseils

Que diriez-vous d'utiliser NSTimer qui fonctionne à chaque seconde, puis vérifiez le temps de cuisson et assurez-vous qu'il est exactement sur le début d'une seconde. Vous pouvez utiliser initWithFireDate:interval:target:selector:userInfo:repeats: ou définir la prochaine fois d'appel à l'aide appropriée setFireDate: après la minuterie a été créé:

NSTimeInterval interval = [[timer fireDate] timeIntervalSinceReferenceDate];
NSTimeInterval nextFire = ceil(interval);
[timer setFireDate: [NSDate dateWithTimeIntervalSinceReferenceDate: nextFire];

Ensuite, vous serez sûr que les feux de minuterie à proximité du la minuterie en retard le temps nécessaire que possible et ne vous inquiétez pas car il se remet à zéro après chaque mise à feu par date de mise à feu prévue et l'intervalle que vous avez fourni, de sorte qu'il essayez toujours de tirer à la deuxième exacte (mais le feu chaque fois que la boucle d'exécution sera en mesure de le faire).

Je ne suis pas sûr de ce que d'autre serait plus efficace. Tant que la fonction de rappel pour votre minuterie ne fait rien trop intense, vous êtes probablement proche de l'optimum.

Comment l'utilisation gettimeofday(2)? Il renvoie beaucoup d'informations heure exacte à utiliser.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top