2013-04-04 5 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

+0

На первый взгляд, ваш код, вероятно, будет делать больше или меньше того, что вы хотите (хотя и довольно неэффективно, потому что он работает как безумный), но использование time() вместо clock() немного упростит ваш код. Чтобы сделать вещи более эффективными, нам нужно будет узнать больше о вашей целевой среде и предоставляемых ею объектах (потоки, ...) – fvu

ответ

2

Когда вы можете помочь, никогда не используйте == в таком случае. Вы настраиваете себя на неудачу. Если по какой-то причине код задерживается, и вы не ударяете его мертвым на 20, тогда вы ввернуты, и вы никогда не будете выполнять свою задачу.

Вы должны быть «при условии, мисс» и делают его таким, как:

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

Да, принимая следующий ток и деление CLOCKS_PER_SEC дает время загрузки процессора. Примечание. Я говорю Используемое время процессора, потому что clock() не сообщает, что время проводит сон, поэтому, если вы используете sleep() звонки в свой код //doing some tasks, это не будет точным. В противном случае этот код должен быть достаточно близок к тому, что вы пытаетесь сделать.

0

Ваш подход может заставить программу съесть 100% времени процессора: программа будет постоянно проверять, не пора ли запускать some_task(). Почему бы не использовать сон():

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

, но я не хочу спать .. Я хочу прочитать пакет для второго 1 до второго 20, а затем, когда достигнем 20, выполните некоторую задачу. ваш отклик сон 20 секунд полностью, и это не правильно !! – user2091416

+0

Возможно, с обработчиком сигнала для SIGALRM с 'alarm (20)', если 'trace_read_packet()' прерывается сигналами? –

+0

Я использую libtrace для этого, и я не думаю, что он прерывается сигналом – user2091416