Как вызывать метод/функцию 50 раз в секунду, а затем вычислять затраченное время, если затраченное время меньше одной секунды, тогда спящий (1 раз) секунд.
Ниже приведен псевдокод
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;
}
}
Я новичок в API-интерфейсах Timer. Может ли кто-нибудь помочь мне, какие API-интерфейсы таймера, я должен использовать для достижения этого. Мне нужен переносимый код.
Сначала прочитайте страницу времени (7).
Затем вы можете вызвать функцию timer_create (2) для настройки таймера. Чтобы запросить время, используйте clock_gettime (2)
Возможно, вам захочется подождать и мультиплексировать некоторые входы и выходы. опрос (2) полезен для этого. Чтобы спать в течение небольшого промежутка времени без использования процессора, рассмотрите нанослое (2)
Если вы используете таймер, выполняете сигналы, читайте сигнал (7) и будьте осторожны, потому что обработчики сигналов ограничены функциями безопасности, совместимыми с асинхронным сигналом (подумайте о наличии обработчика сигнала, который просто устанавливает некоторый глобальный volatile sig_atomic_t
флаг). Вас также может заинтересовать конкретный Linux timerfd_create (2) (который вы можете poll
или передать в цикл событий).
Возможно, вы захотите использовать некоторую существующую библиотеку циклов событий, такую как libevent или libev (или те из GTK/Glib, Qt и т.д.), Которые часто используют poll
(или более интересные вещи). Конкретные события linux eventfd (2) и signalfd (2) могут быть очень полезными.
Продвинутое программирование на Linux также полезно читать.
Если send_msg
выполняет сетевой ввод-вывод, вам, вероятно, придется перепроектировать вашу программу вокруг какого-либо цикла событий (возможно, вашего собственного, основанного на poll
) - вам нужно будет мультиплексировать (т. poll
) как по сетевым передачам, так и по сети. стиль продолжения - это полезная парадигма.