2011-01-10 114 views
2

我正在为Mac编写一个命令行实用程序,它应该在每秒钟打印状态信息。很显然,我不想每秒轮询数十亿次。我能想到的唯一方法是获取当前时间并使用select来等待差异。有没有更好的办法?如何在第二秒每秒运行一次代码?

回答

4

你所做的任何等待都保证至少等待那段时间,而不是完全等待。 OSX不是一个实时操作系统 - 我不认为有什么办法可以保证这样的事情。

如果你只是想要它的估计,然后睡觉现在和你想要的时间之间的差异(也许少一点时间为日志)将工作。

1

通常使用计时器调度方法会有诀窍。然而重要的是要记住,精度对于简单的定时器来说并不是最好的。

1

这是我有:

#import <stdlib.h> 
#import <stdio.h> 
#import <time.h> 
#import <sys/time.h> 

#define TIME_LENGTH 9 

int main() 
{ 
    struct timeval now; 
    struct timespec wait; 

    time_t seconds; 
    char str[TIME_LENGTH]; 

    wait.tv_sec = 0; 

    for (;;) { 
     gettimeofday(&now, NULL); 
     wait.tv_nsec = (1000000 - now.tv_usec) * 1000; 
     nanosleep(&wait, NULL); 

     seconds = now.tv_sec+1; 
     strftime(str, TIME_LENGTH, "%T", localtime(&seconds)); 
     puts(str); 
    } 
} 

它的工作原理,以“眼球”的精度,这应该是足够了。它看起来像更新与内置菜单栏时钟同步。显然,在time.hclock_nanosleep中有一个功能,它可以等待一段时间,而不是等待一段时间,但这种用法在mac上不支持。