2016-12-10 14 views
0

このコードは、ループ内で40秒ごとに関数を呼び出します。 time_tのが私のLinuxシステムに署名されているので、私はこの条件については疑問だ:whileループ内で40秒ごとに関数を呼び出す

if ((time_left <= 0 || time_left > interval)) 

だけ(time_left <= 0)罰金をチェックしていますか?私はいくつかのウェブサイトを参照し、time_left > intervalのチェックを追加しました。このチェックは必要ですか?

int print_timed_op() 
{ 
    time_t  time_now; 
    time_t  time_left; 
    time_t  time_next_interval; 
    int   interval = 40, hit_count =10; //40 second interval, 10 times 
    time_next_interval = time(0) + interval; 

    //tight loop 
    while (1) { 
     sleep(1); 
     time_now = time(0); 
     time_left = time_next_interval - time_now; 
     /* here time_left > interval check required ? */ 
     if ((time_left <= 0 || time_left > interval)) { 
       call_my_fuc(); 
       time_next_interval = time(0) + interval; 
       time_left = interval; 
       hit_count--; 
     } 

     if(hit_count <= 0) 
      break; 
    } 
    return 0; 
} 

注:私は定期的に機能を呼び出すためのLinuxタイマーシステムコールまたは任意の他の方法を使用する必要はありません。

+0

'time_left> interval'は' time_t'にのみ必要ですが、符号なし整数ですが、 'time_left <= 0'で十分です。 –

+3

なぜあなたは' while(1){sleep(40 ); call_my_fuc();} '? (あなたが望むならあなたの 'hit_count'チェックを挿入することができます)。 – e0k

答えて

2

time_left > intervalのチェックは、クロックの変更または同期に対処することです。間隔が40秒で、誰かが来て、システムクロックを更新して1時間前にシフトさせると、そのチェックがないと90回の更新が欠落します。

CLOCK_MONOTONICオプションを使用してを使用すると、より正確な方法でこれを克服することができます。その後、時間は前方または後方にスキップされず、関数呼び出しは常に均等に配置されます。

関連する問題