Endlosschleife mit Timer in C - wie?
-
Hi Ihrs,
ich möchte eine Schleife schreiben, in der eine Funktion pro Sekunde 300 Mal aufgerufen wird. Ein Durchlauf der Funktion benötigt deutlich weniger als 3.333ms, die Zeit bis zum nächsten Durchlauf soll die Rechenkapazität des Rechners wieder frei sein. Das heisst also, dass ich innerhalb einer Sekunde nicht die Funktion 300x direkt nacheinander durchlaufen will und dann den ganzen Rest der Zeit warten muss, sondern dass die Funktion quasi nur aller 3.333ms aufgerufen wird und der Rechner nebenbei auch noch was anderes machen kann. Ich hatte dabei an sowas in der Art gedacht:
#include "main_test.h" int main(void) { FLOAT_T fTestOut=0; while ( sleep (3)); { fTestOut = main_test(); } return(0); }
Sleep soll ja nicht so rechenlastig wie "wait" sein, aber er wartet nicht 3 ms, sondern 3 Sekunden, und die Schleife ist auch noch nicht endlos.
Sicherlich nur was kleines, aber ich komm nicht drauf. Hat jemand ne Idee?
Ach ja, es soll nur C verwendet werden, kein C++!Thx, Tom
-
Du musst noch die richtige Bibliothek includen (ich glaube die <unistd.h>).
Ausserdem wird die Funktion IMHO nicht mit 'sleep 3', sondern mit 'sleep(3)' aufgerufen.
-
ja, das mit dem sleep (3) hab ich grad gemerkt und geändert.
funzt, nur nicht wie gedacht... wozu brauch ich die bibliothek? sollte vielleicht noch erwähnen, dass es unter linux laufen soll...
thx, tom
-
Du brauchst die Bibliothek, weil darin die Funktion 'sleep()' definiert ist. Das ist kein build-in von ANSI-C.
-
Du hast da ein grundsätzliches Verständnisproblem in deinem Code.
while(sleep(3)) { }
Das bedeutet, dass die while-Schleife den Rückgabewert der Funktion sleep() testet. Was du willst ist:
while(1) { sleep(3); // deine Funktion }
Wobei die 1 durch irgend eine wahre Bedingung zu ersetzen ist.
Ich würde das aber an deiner Stelle mit richtigen Timern programmieren. Ist irgendwie professioneller.
edit:
sleep(3) wartet 3 Sekunden. Du bräuchtest usleep()!
-
danke für die schnellen antworten!
hab das jetzt angepasst, das mit usleep (333) auch. funzt auch ohne die unistd.h, jetzt klemmts dafür an irgend nem segmentation fault, aber das ist ne andere baustelle...
tom
-
tomcat22 schrieb:
funzt auch ohne die unistd.h
das heißt aber noch lange nicht, dass du den header nicht inkludieren musst!
kompilier mal mit der -Wall flag (ich schätze du verwendest gcc) und schau dir den output an (achte besonders auf die zeilen wie "implicit declaration...")!!mfg
Sebastian
-
mit Linux-Beistand kann ich nicht dienen, aber unter Windows (include-datei: windows.h) schreibt man nicht
sleep(3);
sondern
Sleep(3);
mfG (c)h
-
Zum Glück geht's hier um Linux
-
Dieser Thread wurde von Moderator/in AJ aus dem Forum ANSI C in das Forum Linux/Unix verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
DarthZiu schrieb:
Wobei die 1 durch irgend eine wahre Bedingung zu ersetzen ist.
och, die 1 ist schon ganz schön wahr
-
DrGreenthumb schrieb:
DarthZiu schrieb:
Wobei die 1 durch irgend eine wahre Bedingung zu ersetzen ist.
och, die 1 ist schon ganz schön wahr
Nein, wirklich??
Ich meinte das nur, weil er ja sicherlich ne andere Abbruchbedingung einbauen will...
-
abbruchbedingung soll keine andere rein, höchstens noch was mit den prioritäten, denn für die kurze zeit, in der die funktion ausgeführt wird, soll der prozess höchste priorität haben und auch sofort ausgeführt werden.
danke erstmal!
tom
-
chille07 schrieb:
mit Linux-Beistand kann ich nicht dienen, aber unter Windows (include-datei: windows.h) schreibt man nicht
sleep(3);
sondern
Sleep(3);
Nicht eher Sleep(3000); ??
-
Sgt. Nukem schrieb:
chille07 schrieb:
mit Linux-Beistand kann ich nicht dienen, aber unter Windows (include-datei: windows.h) schreibt man nicht
sleep(3);
sondern
Sleep(3);
Nicht eher Sleep(3000); ??
Sleep( Zeit in Millisekunden );
also, wenn du nur 3 millisekunden warten wolltest..
aber ich hab das Sleep(3) nur als Bsp. gepostet, und nicht gesehen, dass 3 sekunden gefragt waren.mfG (c)h
-
usleep("zeit in mikrosekunden")
sleep("zeit in sekunden")tom
-
ich rede von "windows.h"
--> Sleep( {millisekunden} );mfG (c)h
-
wen interessiert hier bitte windows?
-
siehe oben^^
"sie" haben auch von "sleep" geredet, als es noch nicht um linux gingmfG (c)h