bestimmte Zeit als Abbruchkriterium
-
Hallo alle zusammen!
Ich möchte eine while Schleife solange etwas ausführen lassen, solange eine bestimmte Zeit(z.B. 5 Minuten) nicht vorbei sind.
Wie kann ich sowas realisieren?
Welche header muss ich dazu benutzen?
Gibt es vieleicht schon eine funktion die ein Timer ist?Viele Grüße und Danke im voraus!
arkr23
-
-
Danke für den Link!
Doch gegooglet habe ich auch schon und leider nichts vergleichbares gefunden...
-
nwp2 schrieb:
Kuck mal http://www.cplusplus.com/reference/clibrary/ctime/ oder http://www.gidf.de/c+time
Das geht aber auch ein bisschen benutzerfreundlicher, Bruder:
http://www.igtfy.com/?q=+C+Time
-
Möglich wäre es auch mit alarm( sekunden ) --> ist in unistd.h drin
-
Feld schrieb:
Möglich wäre es auch mit alarm( sekunden ) --> ist in unistd.h drin
unistd.h? Was ist denn das?
-
arkr23 schrieb:
Danke für den Link!
Doch gegooglet habe ich auch schon und leider nichts vergleichbares gefunden...Huhu,
wieso so faul ? Sag doch gleich du willst nicht googeln.
Ich habe mich bisher noch nie mit "time.h" beschäftigt. Aber ein bischen googeln und fertig:void wait ( int seconds ) { clock_t endwait; endwait = clock () + seconds * CLOCKS_PER_SEC ; while (clock() < endwait) {} }
War doch gar nicht so schwer...
Das geht aber auch ein bisschen benutzerfreundlicher, Bruder:
http://www.igtfy.com/?q=+C+Time
LoL, geiles Bild
-
Busywait omg. Du solltest allermindestens ein sleep in die whileschleife packen. Andererseits wenn du sleep kennst kannst du auch gleich sleep mit der entsprechenden Zeit benutzen.
Und mit google und "c sleep" kommt man Wunder über Wunder nach http://www.c-plusplus.net/forum/viewtopic-var-t-is-190320.html
-
nwp2 schrieb:
Busywait omg. Du solltest allermindestens ein sleep in die whileschleife packen. Andererseits wenn du sleep kennst kannst du auch gleich sleep mit der entsprechenden Zeit benutzen.
er möchte während der zeit code ausführen (siehe erstes posting). Sleep (mit grossem S unter win), wär dafür nicht so gut.
-
nwp2 schrieb:
Busywait omg.
Wieso ? Er muss lediglich den Code etwas umändern. Ein Sleep wäre total fehl am Platz, wenn er Anweisungen für eine bestimmte Zeit ausführen will.
void wait ( int seconds ) { clock_t endwait; endwait = clock () + seconds * CLOCKS_PER_SEC ; while (clock() < endwait) { //... Hier kommt sein Code rein. } }
-
Ein Sleep wäre total fehl am Platz
das sehe ich ein bischen anders...
da sein code stückchen sicher nicht so oft pro sekunde ausgeführt werden muß.void wait( int seconds) { clock_t endwait; endwait = clock () + seconds * CLOCKS_PER_SEC ; while (clock() < endwait) { //... Hier kommt sein Code rein. sleep(1); } }
lg lolo
-
noopLolo schrieb:
da sein code stückchen sicher nicht so oft pro sekunde ausgeführt werden muß.
woher willste das wissen? vielleicht braucht er in der zeit die volle rechenpower.
-
also das sleep ist and der position wirklich schlecht aufgehoben, und statt an dem alten teil rum zu basteln hab ich auch mal ne kleine version gebastelt. denke der overhead hält sich in grenzen wenn mans auf ner schnelleren maschiene verwendet
evtl. kann ja jemand was damit anfangen...#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/time.h> #define MICRO_IN_SEC 1000000.00 double microtime(){ struct timeval tp = {0}; gettimeofday(&tp,0); return (double)(tp.tv_sec + tp.tv_usec / MICRO_IN_SEC); } void execute(void (*callback)(void),double forSeconds,double timesPerSecond){ double endTime = microtime() + forSeconds; double loopStartTime; double sleepForUsec = 1. / timesPerSecond; do{ loopStartTime = microtime(); printf("hi\n"); usleep((__useconds_t)((sleepForUsec-(microtime()-loopStartTime))*MICRO_IN_SEC)); }while(endTime-microtime()>0); } void callback(void){ printf("hi"); } int main(void){ double forSeconds = 3.; double timesPerSecond = 5.; execute(callback,forSeconds,timesPerSecond); return 0; }
-
ups in zeile 18 muß natürlich callback(); statt printf("hi\n"); stehen
-
was fürn shit lolol
-
ja stimmt
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/time.h> #define MICRO_IN_SEC 1000000.00 double microtime(){ struct timeval tp = {0}; gettimeofday(&tp,0); return (double)(tp.tv_sec + tp.tv_usec / MICRO_IN_SEC); } void execute(void (*callback)(void),double forSeconds,double timesPerSecond){ if(callback==((void*)0) ||forSeconds<=0 ||timesPerSecond<=0){ callback(); return; } double endTime = microtime() + forSeconds; double loopStartTime; double sleepForUsec = 1. / timesPerSecond; double timeBuffer; do{ loopStartTime = microtime(); callback(); timeBuffer = ((sleepForUsec-(microtime()-loopStartTime))*MICRO_IN_SEC); if(timeBuffer>0) usleep((__useconds_t)timeBuffer); }while(endTime-microtime()>0); } void callback(void){ printf("hi\n"); } int main(void){ double forSeconds = 0.5; double maxTimesPerSecond = 10.0; execute(callback,forSeconds,maxTimesPerSecond); return 0; }
ist etwas besser
lg lolo
-
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/time.h> #define MICRO_IN_SEC 1000000.00 double microtime(){ struct timeval tp = {0}; gettimeofday(&tp,0); return (double)(tp.tv_sec + tp.tv_usec / MICRO_IN_SEC); } void execute(void (*callback)(void),double forSeconds,double timesPerSecond){ if(callback==((void*)0) ||forSeconds<=0 ||timesPerSecond<=0){ if(callback!=((void*)0)) callback(); return; } double endTime = microtime() + forSeconds; double loopStartTime; double sleepForUsec = 1. / timesPerSecond; double timeBuffer; do{ loopStartTime = microtime(); callback(); timeBuffer = ((sleepForUsec-(microtime()-loopStartTime))*MICRO_IN_SEC); if(timeBuffer>0) usleep((__useconds_t)timeBuffer); }while(endTime-microtime()>0); } void callback(void){ printf("hi\n"); } int main(void){ double forSeconds = 0.5; double maxTimesPerSecond = 10.0; execute(callback,forSeconds,maxTimesPerSecond); return 0; }
irgendwann hab ich sie schon die bugs...
-
wie wäre es wenn du erstmal nachdenkst bevor du deine fehlerhaften codes hier reinstellst und den op dadurch nur verwirrst???
was spricht gegen diese lösung?
void wait ( int seconds ) { clock_t endwait; endwait = clock () + seconds * CLOCKS_PER_SEC ; while (clock() < endwait) { //... Hier kommt sein Code rein. } }
-
wie wäre es wenn du erstmal nachdenkst bevor du deine fehlerhaften codes hier reinstellst und den op dadurch nur verwirrst
ja das tut mir natürlich leid machs eigentlich immer nach bestem wissen und gewissen.
was spricht gegen diese lösung
der stromverbrauch
nein im ernst sollte er in zukunft evtl. doch mal ein sleep oder usleep verwenden wollen wird das bei clock() nicht berücksichtigt da dass in der zeit in welcher der prozess schläft nicht weiterzählt oder lieg ich da falsch?
-
sollte er in zukunft evtl. doch mal ein sleep oder usleep verwenden wollen wird das bei clock() nicht berücksichtigt da dass in der zeit in welcher der prozess schläft nicht weiterzählt oder lieg ich da falsch
falsch, denn das ist natürlich abhänging von der implementation des sleep() bzw. Sleep() befehls denn ein sleep aka
void sleep(int t){ while(t--); }
zählt clock() hoch...
anzumerken wäre evtl. dass zeit functionen mit höherer auflösung sprich besser als ne sekunde unter c immer bischen schwierig bzw. plattform abhängig sind und man manchmal nicht um ne zeile assembler rum kommt.