Comment puis-je exécuter du code une fois par seconde, sur la seconde?

J’écrivais un utilitaire de ligne de commande pour Mac qui devrait imprimer des informations d’état chaque seconde, sur la seconde. De toute évidence, je ne veux pas interroger un million de fois par seconde. Le seul autre moyen auquel je peux penser est d’obtenir l’heure actuelle et d’utiliser select pour attendre la différence. Y a-t-il une meilleure façon?

Toute attente est garantie d’attendre au moins ce laps de temps, pas exactement. OSX n’est pas un système d’exploitation en temps réel – je ne pense pas qu’il y ait de moyen de garantir quelque chose comme ça.

Si vous voulez juste que ce soit estimé, alors dormir la différence entre maintenant et le temps que vous voulez (peut-être un peu moins de temps pour le journal) fonctionnera.

Habituellement, planifier une méthode avec timer fait l’affaire. Même s’il est important de se rappeler, la précision n’est pas la meilleure avec les timers simples.

Voici ce que j’ai:

#import  #import  #import  #import  #define TIME_LENGTH 9 int main () { struct timeval now; struct timespec wait; time_t seconds; char str[TIME_LENGTH]; wait.tv_sec = 0; for (;;) { gettimeofday(&now, NULL); wait.tv_nsec = (1000000 - now.tv_usec) * 1000; nanosleep(&wait, NULL); seconds = now.tv_sec+1; strftime(str, TIME_LENGTH, "%T", localtime(&seconds)); puts(str); } } 

Cela fonctionne à la “précision du globe oculaire”, ce qui devrait être suffisant. Il semble que sa mise à jour soit synchronisée avec l’horloge de la barre de menus intégrée. Evidemment, il existe une fonction dans time.h , clock_nanosleep , qui peut attendre une heure plutôt que d’attendre un certain temps, mais cette utilisation n’est pas prise en charge sur le mac.