2013-04-04 108 views
-1

我想在C.
以限定的時間間隔例如我想要執行一些任務,每20秒;以下代碼是否適合此任務?在C中定義的時間間隔

的澄清,我們在與時間間隔工作目標。例如我想讀取數據包每隔20秒,並在每個間隔結束我想更改一些參數。

double blocktime = 20.000000; 
clock_t current, next; 

current = clock(); 
    while(trace_read_packet(trace,packet)> 0){ 
     //doing some tasks 
     next = clock(); 
     if ((double((next - current)/CLOCKS_PER_SEC))== blocktime) // if it is end of the interval do some tasks 
     { 
          //doing some task 
      current = next; 

     } 
    }//end of while 

和其他問題如何我可以定義與時代一起工作的循環?

+2

什麼是你的問題? – 2013-04-04 15:11:37

+0

只是什麼是「編寫代碼」? – Lundin 2013-04-04 15:15:52

+0

乍一看,你的代碼可能會做或多或少你想要什麼(儘管很低效,因爲它到處跑,像瘋了一樣),但使用時間()而不是時鐘()將簡化您的代碼位。爲了使事情更有效率,我們需要更多地瞭解你的目標環境和它提供的工具(線程......) – fvu 2013-04-04 15:18:30

回答

2

如果你能幫助它,從來沒有在這樣的情況下使用==。你正在爲失敗而努力。如果由於某些原因,代碼被延遲,並且你沒有在20點擊中它,那麼你就被搞砸了,你永遠無法完成你的任務。

你應該是「假設小姐」,並做如:

if ((double((next - current)/CLOCKS_PER_SEC))>= blocktime) 

是,服用下一電流和CLOCKS_PER_SEC分割給你使用的CPU時間。請注意我說CPU時使用因爲clock()不報告花費的時間睡覺,所以如果你用你的//doing some tasks代碼sleep()調用,這不會是準確的。否則,這段代碼應該足夠接近你想要做的事情。

0

你的方法可以使程序吃CPU時間的100%:該計劃將永久檢查,如果它的時間來運行some_task()。 爲什麼不使用的睡眠():

while (1) { 
    /* packet handling.. */ 
    sleep(20); 
    some_task(); 
} 
+0

但我不想睡覺..我想讀包第二個1到第二個20,然後到達20時做一些任務。你的應答完全睡20秒,這是不正確的! – user2091416 2013-04-04 17:07:21

+0

也許對於SIGALRM的信號處理程序,如果trace_read_packet()可以被信號中斷,那麼使用'alarm(20)'? – 2013-04-04 17:23:37

+0

我使用libtrace的,我不認爲它可以通過信號中斷 – user2091416 2013-04-04 17:30:27