2013-10-12 2 views
0

Как вызвать метод/функцию 50 раз в секунду, а затем вычислить затраченное время. Если затраченное время меньше одной секунды, тогда спящий (1 раз) секунд.Как вызвать метод/функцию 50 раз в секунду

Ниже приведен псевдокод

while(1) 
{ 
    start_time = //find current time 
    int msg_count=0; 
    send_msg(); 
    msg_count++; 

    // Check time after sending 50 messages 
    if(msg_count%50 == 0) 
    { 
    curr_time = //Find current time 
    int timeSpent = curr_time - start_time ; 
    int waitingTime; 

    start_time = curr_time ; 

    waitingTime = if(start_time < 1 sec) ? (1 sec - timeSpent) : 0; 
    wait for waitingTime; 
    } 
} 

Я новичок с Timer API. Может ли кто-нибудь помочь мне, какие API-интерфейсы таймера, я должен использовать для достижения этого. Мне нужен переносимый код.

+0

Насколько точны вы хотите быть? Вы уверены, что ваша обработка ('send_msg', которая, возможно, может блокироваться) всегда занимает гораздо меньше 20 миллисекунд, т. Е. Период для 50 Гц? –

+1

Возможный дубликат функции [C++ Timer для обеспечения времени в секундах nano] (http://stackoverflow.com/questions/275004/c-timer-function-to-provide-time-in-nano-seconds) – Joe

ответ

2

Сначала прочитайте справочную страницу time(7).

Чтобы настроить таймер, вы можете позвонить по телефону timer_create(2). Чтобы запросить время, используйте clock_gettime(2)

Возможно, вам захочется подождать и мультиплексировать некоторые входы и выходы. poll(2) полезен для этого. Для того, чтобы спать в течение небольшого промежутка времени без использования CPU считает nanosleep(2)

При использовании таймера делают сигналы, чтение signal(7) и быть осторожным, потому что обработчики сигналов ограничены асинхронного сигнал безопасных функций (рассмотреть наличие обработчика сигналу, который просто устанавливает некоторый глобальный флаг volatile sig_atomic_t). Вас также может заинтересовать конкретный Linux timerfd_create(2) (который вы могли бы poll или перейти к вашему циклу событий).

Вы можете использовать некоторые существующие event loop библиотеки, как libevent или libev (или тех, от GTK/Glib, Qt, и т.д ...), которые часто с использованием poll (или фантастические вещи). Линукс eventfd(2) и signalfd(2) могут быть очень полезными.

Advanced Linux Programming также полезно читать.

send_msg Если делает сеть I/O, вы, вероятно, нужно перестроить свою программу вокруг некоторого цикла событий (возможно, ваш собственный, основанный на poll) - вам нужно мультиплекс (т.е. poll) и в сети посылает и сеть recieves. continuation-passing style - полезная парадигма.

Смежные вопросы