bestimmte Zeit als Abbruchkriterium



  • 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.



  • µngbd schrieb:

    Feld schrieb:

    Möglich wäre es auch mit alarm( sekunden ) --> ist in unistd.h drin

    unistd.h? Was ist denn das?
    😕

    http://opengroup.org/onlinepubs/007908799/xsh/unistd.h.html

    der erste link von google nach unistd.h



  • Feld schrieb:

    µngbd schrieb:

    Feld schrieb:

    Möglich wäre es auch mit alarm( sekunden ) --> ist in unistd.h drin

    unistd.h? Was ist denn das?
    😕

    http://opengroup.org/onlinepubs/007908799/xsh/unistd.h.html

    der erste link von google nach unistd.h

    Und was hat das mit C zu tun?
    😕


Anmelden zum Antworten