2013-03-24 41 views
0

我想運行例如FUNC()每秒正好是1周時間的函數。但是func()的運行時間大約是500毫秒。我怎樣才能做到這一點?我知道如果函數的運行時間很短,我可以在每次執行後在func()和sleep()中寫一個while循環1秒。但現在,運行時間很長。我應該怎麼做才能確保func()每秒精確運行1次?謝謝。如何定期執行某些功能,如果這個功能隨時間需要運行(比peroid以下)

+0

Windows還是linux?你想要你的代碼是可移植的嗎?您可以使用定時器,但在Windows我建議['CreateTimerQueueTimer'(http://msdn.microsoft.com/en-us/library/windows/desktop/ms682485(V = vs.85)的.aspx) – Serdalis 2013-03-24 03:22:20

回答

3

呦做到:

  1. 採取START_TIME當前時間。
  2. 完成工作
  3. 以當前時間END_TIME
  4. 等待(即1秒+ - END_TIME)

這樣一來,就可以執行每幾秒鐘內你的任務可靠。如果任務花費的時間更少,則會等待更長時間,反之亦然。但是請注意,這假設你的任務總是少於1秒。執行。在真實的代碼中,你想在sleep語句之前檢查它。

實施細節取決於平臺。

注意,使用這種方法仍然導致小的漂移,由於它需要計算步驟4.一種更準確的替代方法是在一秒鐘的整數倍同步的時間。那樣,超過1000個週期你不會漂移。

這取決於精度的你所需要的水平。

+0

謝謝。你能給我更多關於整數同步的細節嗎?謝謝。 – user2172495 2013-03-24 04:06:57

1

如果你想有一個畜生,便於代碼的解決方案,你可以得到時間的函數的第一次運行之前,並將其保存在某個變量(START_TIME)。創建存儲下一個重複編號的重複索引計數變量(repeat_number)。那麼你可以這樣做:

1) next_run_time = ++repeat_number*1sec + start_time; 
2) func(); 
3) wait_time = next_run_time - current_time; 
4) sleep(wait_time) 
5) goto 1; 

這種方法可以禁止在每次迭代時累積時間誤差。

但對於實際的應用,你應該找到一些事件框架或庫。

+0

謝謝。什麼時候應該獲得current_time? – user2172495 2013-03-24 04:09:19

+0

current_time是計算wait_time時的當前時間。 =) – JustAnotherCurious 2013-03-24 04:12:25

+0

我想我明白了。那麼next_run_time是準確的時間嗎? – user2172495 2013-03-24 04:13:08