Ich versuche mir gerade eine Funktion zu programmieren, die das Programm um die angegebenen Milliskeunden schlafen legt und die dazu noch portabel ist.
Ansatz:
Code:
#ifdef WIN32 #include "windows.h" #else #include "unistd.h" #endif //Wait the specific milli seconds (and check which system is used) inline void CrossSleep(const unsigned int MilliSeconds) { #ifdef WIN32 Sleep(MilliSeconds); #else usleep(MilliSeconds * 1000); #endif }
Auf genaue Zeiten kannst du dich mit Sleep, sleep und usleep nur unter sehr speziellen Umständen verlassen - dazu kommt, dass das Drumherum auch nochmal Zeit frisst, und der Kernel-Scheduler auch andere Prozesse zu berücksichtigen hat. Gerade bei sehr kleinen Intervallen kommt es da zu Ungenauigkeiten.
Du kannst mit sched_setscheduler und nanosleep eine brauchbare Annäherung implementieren, aber - wozu brauchst du das eigentlich? Wenn du da real-time-Applikationen bauen willst, ist das ein denkbar schlechtes Fundament. -- Einfachheit ist Voraussetzung für Zuverlässigkeit. -- Edsger Wybe Dijkstra
Wie soll das denn die CPU entlasten? Ich hab grad Probleme, mir da nen Zusammenhang herzukonstruieren. -- Einfachheit ist Voraussetzung für Zuverlässigkeit. -- Edsger Wybe Dijkstra
Ist trotzdem sehr schlecht. Wenn du auf bestimmte Ereignisse wartest gibt es da entsprechende Funktionen für. Unter Windows wäre das zum Beispiel WaitForSingleObject unter anderen Systemen wird es garantiert ähnliches geben...
while(!(Bedigung die erst nach einer Weile eintritt)) { //Do some standard stuff usleep(1); //relief the CPU }
Ich warte also nicht stur sondern es läuft schon code in der Schleife ab, der dann abgebrochen wird, wenn die Bedingung erfüllt ist. Nur muss diese sache nicht die CPU zu 100% belasten... daher das usleep...
Doch ist es Das lastet das System zwar nicht mehr so stark aus wie ohne ein Sleep aber es ist trotzdem eine unnötige Belastung die durch ein vernünftiges Design vermieden werden könnte.
Das kommt auf den Fall drauf an. Du kannst nicht mal gerade so eine für alle Systeme portable Funktion aus dem Ärmel schütteln welche sich um solche sehr speziefischen Dinge kümmert. Sonst gäbe es sowas ja auch schon (wobei ich nicht weiß ob es sowas nicht sogar schon bei den verschiedenen plattformübergreifenden Bibliotheken gibt weil ich sie nicht nutze).