如何定义循环运行几秒/分钟

我的目的是在规定的时间内执行一个while循环(例如在这个例子中是90秒)。 它不一定是完全90秒,但1-2秒的不准确是可以接受的。 我修理使用clock()函数来达到这个目的:

 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; } 

当我在我的笔记本电脑(x86,3.13内核,gcc 4.8.2)上运行它时,我的秒表测量了72秒完成。 (我的笔记本电脑需要1000秒精确度)

当我在ARM设备(armv5tejl,3.12内核,gcc 4.6.3)上运行它时,需要58秒才能完成代码。 (我需要在armv5上使用100次)。

我在室温下运行代码,所以时钟应该是稳定的。 我知道,内核睡眠的线程,并有时间来唤醒他们等不准确,因此,正如我以前所说,我不期望得到一个完美的时间,但它应该有一些准确性。

我曾尝试过使用(甚至是nanosleep ),但是解决scheme并不好。 最后,我提出了获取系统时间(小时,分钟,秒)的底部代码,然后计算经过的时间。 它的工作精度很高。

我想知道是否有另一种解决scheme,使用成本较低?

 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; } 

最后,我需要在一个pthread运行它。

  1. 使用time()clock() 。 编码目标是确定耗时,而不是使用处理器时间。

    当前代码计算了过程时间* 1000,并将其与90秒进行比较。

    clock() ,其@esp暗示,返回“时钟功能决定处理器使用时间”。 C11dr§7.27.2.12。

    time()返回“时间函数决定当前日历时间”§7.27.2.42

    difftime()在查找2个time_t (以任何单位/类型)之间的差异并以秒为单位返回差异方面做得很好。

     int main(void) { time_t start, end; double elapsed; // seconds start = time(NULL); int terminate = 1; while (terminate) { end = time(NULL); elapsed = difftime(end, start); if (elapsed >= 90.0 /* seconds */) terminate = 0; else // No need to sleep when 90.0 seconds elapsed. usleep(50000); } printf("done..\n"); return 0; } 
  2. 次要:注意:使用clock() ,不需要* 1000 。 在运行gcc的基于windows的机器上, clock()也返回调用进程的CPU时间。

     elapsed = ((double) (end-start)) / (double) CLOCKS_PER_SEC *1000; elapsed = ((double) (end-start)) / CLOCKS_PER_SEC; 
  3. 轻微:不需要volatileelapsed仅仅是由于这个代码而改变。

     // volatile double elapsed; double elapsed; 

你的第一个版本似乎没有工作的原因是在Linux上clock()测量使用的CPU时间,而不是实时(见这里 )。 既然你正在睡觉的过程,那么真正的和CPU的时间不匹配。 解决方案是检查真实时钟的时间,如你的第二个例子。

请注意,在Windows clock()会给你真正的时钟时间(见这里 )。

使用警报并捕捉信号。 信号处理程序将中断进程的执行。 你也可以尝试pthread_cancel 。 单独运行时间t的基于循环或睡眠的方法在时间t可能是不准确的。 如果循环是长时间运行,执行路径很紧,睡觉或打破都不能解决你的问题。