2013-09-23 28 views
0

我想每秒執行一些操作。我不希望蜱在每兩秒鐘內準確。但從長遠來看,我希望他們的平均水平。
0.999,2.005,2.995,3.950,5.012,... 999.01,1000.011,...
功能可能不完全每秒執行的,但是:我可以在OS X編程中獲得時鐘秒鐘事件嗎?

例如,蜱可以在這樣的時間順序發生從長遠來看,平均而言不會有(或很小)的錯誤。

一個簡單的方法是使用的NSTimer。但是存在一個問題:如果CPU比例高,NSTimer將以輕微的延遲觸發。例如,它可以按如下順序觸發:
1.001,2.002,3.004,4.005,5.006,... 999.999,1001.001,...
隨着時間的流逝,時間誤差可能會越來越大。

因此,有沒有什麼辦法來捕捉在Xcode中的任何時間的推移事件?像「NSTimeNotificationSecondPassed」或...?

+1

號OS X是不是一個實時操作系統。 –

+0

您需要多長時間才能準確計時? – zneak

+0

@zneak哦,對不起,我的表情錯誤。我不希望每一秒都準確。例如,隨着時間流逝1000秒,我希望我的應用程序通知1000次。每秒是否在準確時間發佈通知並不重要。 –

回答

0

我有開發一種方法來實現我的目標:

  1. 創建一個線程是這樣的:

    - (void)_threadHandleTick:(id)arg 
    { 
        while(...) 
        { 
         @autoreleasepool 
         { 
          [self sleepToNextSecond]; 
          ...  /* Do what ever you like or raise a noification */  
         } 
        } 
    } 
    

然後- sleepToNextSecond方法:

- (void)sleepToNextSecond 
    { 
     NSDateFormatter *microSecondFormat = [[NSDateFormatter alloc] init]; 
     [microSecondFormat setDateFormat:@"SSSSSS"]; 

     NSString *microSecondString = [microSecondFormat stringFromDate:[NSDate date]]; 
     useconds_t microSeconds = 1000000 - ((useconds_t)[microSecondString integerValue]); 

     usleep(microSeconds); 
    } 

完成。