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
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).
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.
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.
- 1. Remmina zeichnet einmal pro Sekunde neu - wie man es stoppt?
- 2. kann nicht Code ausführen nur einmal
- 3. Android OnLocationChanged nur einmal pro Sekunde am schnellsten angerufen
- 4. Ich kann den AOT-Code nicht ausführen
- 5. Sensorwerte pro Sekunde abrufen
- 6. Transaktionen pro Sekunde
- 7. Android: Standard Weg, um einen Thread pro Sekunde ausführen
- 8. Wie mache ich n mal pro Sekunde etwas?
- 9. Wie binde ich einmal pro ng-Klick?
- 10. Jede Möglichkeit, CompositionTarget.Rendering zu erzwingen X-Frames pro Sekunde ausführen?
- 11. Code einmal für jede C++ Klassenschabloneninstanz ausführen
- 12. Wie feuern 10 Nachrichten pro Sekunde?
- 13. Wie viele Anfragen kann SQL Server pro Sekunde verarbeiten?
- 14. Python: Wie bekomme ich die Anzahl der Millisekunden pro Sekunde
- 15. Kann ich KiGG auf XP Pro ausführen?
- 16. Wie viele Anfragen pro Sekunde kann libmemcached verarbeiten?
- 17. android Ausführen von Code nur einmal
- 18. Wie Frames pro Sekunde in WebGL erreichen?
- 19. iOS - Datenbankschema erstellen (Code nur einmal ausführen)
- 20. Grails Ausführen von Code pro-Umgebung
- 21. Wie bekomme ich die Bytes pro Sekunde in einem Download?
- 22. Wie erkenne ich die Ticks eines animierten GIFs pro Sekunde?
- 23. Wie kann ich OnClick-Ereignisse nur einmal ausführen?
- 24. Wie kann ich HTML Code nicht ausführen?
- 25. Code einmal ausführen Sinatra-Server läuft
- 26. Kann ich JavaScript in Swift-Code ausführen?
- 27. ssh-Schlüssel einmal pro Login statt einmal pro Bash hinzufügen
- 28. Kann ich den ipython-Exit vom aufrufenden Code ausführen?
- 29. 20 Empfängt pro Sekunde mit SocketAsyncEventArgs
- 30. Wo setze ich Code in Sinatra (Ruby Web Framework), den ich nur einmal ausführen möchte?