comment définir une boucle à exécuter pendant quelques secondes/minutes

Mon but est d'exécuter un while en boucle pendant un temps défini (par exemple, 90 secondes pour cet exemple). Il n'a pas à être exactement de 90 s, mais 1 ou 2 secondes inexactitude est acceptable. J'ai uniforme à l'utilisation de l'horloge()` la fonction de ce but:

int main(void){
      clock_t start, end;
      volatile double elapsed;
      start = clock();
      int terminate = 1;
      while(terminate)
      {
              end = clock();
              elapsed = ((double) (end-start)) / (double) CLOCKS_PER_SEC *1000;
              printf("elapsed time:%f\n",elapsed);
              if(elapsed >= 90.0)
                        terminate = 0;
               usleep(50000);
       }
      printf("done..\n");
    return 0;
}

quand je le lance sur mon ordinateur portable (x86, noyau 3.13, gcc 4.8.2), mon chrono mesures 72 secondes pour qu'il soit terminé. (1000 a été nécessaire d'avoir la elapsed en quelques secondes précision sur mon portable)

Lorsque je l'exécute sur un BRAS de l'appareil (armv5tejl, 3.12 noyau, gcc 4.6.3), il prend 58 secondes pour valider le code. (J'ai besoin d'utilisé 100 sur elapsed sur le armv5).

J'exécute le code de la température de la pièce, de sorte que l'horloge doit être stable. Je sais que le noyau dort le fils et a l'imprécision avec le temps de les réveiller, etc. Donc, comme je l'ai dit précédemment, je ne vous attendez pas à obtenir un timing parfait, mais il faut avoir une certaine précision.

J'avais essayé d'utiliser uniquement usleep (même nanosleep), mais la résolution n'est pas bonne. À la fin j'arrive avec le bas de code qui récupère le système de temps (heure, minute, seconde) puis de calculer le temps écoulé. Et il fonctionne avec une bonne précision.

Je me demande si il y a une autre solution qui serait moins coûteux à utiliser?

typedef struct{
int hour;
int minute;
int second;
} timeInfo;
timeInfo getTimeInfo(void){
timeInfo value2return;
time_t rawtime;
struct tm * timeinfo;
time(&rawtime);
timeinfo = localtime(&rawtime);
value2return.hour = timeinfo->tm_hour;
value2return.minute = timeinfo->tm_min;
value2return.second = timeinfo->tm_sec;
return value2return;
}
int checkElapsedTime(const timeInfo *Start, const timeInfo *Stop, const int Reference){
if(Stop->hour < Start->hour){
printf("1:%d\n", (Stop->hour +24) *3600 + Stop->minute *60 + Stop->second - (Start->hour *3600 +Start->minute * 60 + Start->second));
if( ( (Stop->hour +24) *3600 + Stop->minute *60 + Stop->second - (Start->hour *3600 +Start->minute * 60 + Start->second)) >= Reference )
return 0; //while(0): terminate the loop
else
return 1; //while(1)
}else{
printf("2:%d\n",Stop->hour *3600 + Stop->minute *60 + Stop->second - (Start->hour *3600 +Start->minute * 60 + Start->second));
if( (Stop->hour *3600 + Stop->minute *60 + Stop->second - (Start->hour *3600 +Start->minute * 60 + Start->second)) >= Reference )
return 0;
else
return 1;
}
}
int main(void){
timeInfo stop, start = getTimeInfo();
int terminate = 1;
while(terminate)
{
stop = getTimeInfo();
terminate = checkElapsedTime(&start, &stop, 90);
usleep(5000); //to decrease the CPU load
}
printf("terminated\n");
return 0;
}

Enfin, j'ai besoin de l'exécuter à l'intérieur d'un pthread.

OriginalL'auteur Angs | 2014-08-24