2011-01-10 22 views
2

Ich schrieb ein Befehlszeilen-Dienstprogramm für Mac, das Statusinformationen jede Sekunde auf der zweiten ausdrucken sollte. Offensichtlich möchte ich nicht zig Mal pro Sekunde abfragen. Der einzige andere Weg, an den ich denken kann, ist, die aktuelle Zeit zu bekommen und select zu verwenden, um den Unterschied abzuwarten. Gibt es einen besseren Weg?Wie kann ich den Code einmal pro Sekunde ausführen?

Antwort

4

Jede Wartezeit, die Sie tun, ist garantiert mindestens diese Zeit zu warten, nicht genau. OSX ist kein Echtzeit-Betriebssystem - ich glaube nicht, dass man so etwas garantieren kann.

Wenn Sie nur geschätzt werden möchten, dann wird der Unterschied zwischen jetzt und der gewünschten Zeit schlafen (vielleicht ein wenig weniger, um Zeit für das Protokoll zu geben).

1

Das Planen einer Methode mit Timer ist normalerweise der Trick. Wie wichtig es sich auch zu merken ist, die Präzision ist nicht die beste mit einfachen Timern.

1

Hier ist, was ich habe:

#import <stdlib.h> 
#import <stdio.h> 
#import <time.h> 
#import <sys/time.h> 

#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); 
    } 
} 

Es funktioniert auf „Augapfel“ Präzision, die gut genug sein sollte. Es sieht so aus, als ob es synchron mit der eingebauten Menüleiste aktualisiert wird. Offensichtlich gibt es eine Funktion in time.h, clock_nanosleep, die bis zu einer gewissen Zeit warten kann, anstatt für eine gewisse Zeit zu warten, aber diese Verwendung wird auf dem Mac nicht unterstützt.

Verwandte Themen