2011-01-10 101 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上不支持。