如何在一秒钟内调用方法/函数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;
}
}
我是Timer API的新手。谁能帮助我什么是计时器API,我必须用来实现这一点。我想要便携式代码。
答案 0 :(得分:2)
首先,阅读time(7)手册页。
然后您可能需要致电timer_create(2)来设置计时器。要查询时间,请使用clock_gettime(2)
您可能想要等待并在某些输入和输出上进行多路复用。 poll(2)对此非常有用。要在不使用CPU的情况下休眠一小段时间,请考虑nanosleep(2)
如果使用定时器执行信号,请阅读signal(7)并小心,因为信号处理程序仅限于 async-signal-safe函数(考虑使用一个信号处理程序,它只设置一些全局timerfd_create(2) 1}}旗帜)。您可能也会对特定于Linux的event loop感兴趣(您可以volatile sig_atomic_t
或传递给您的事件循环)。
您可能希望使用一些现有的libevent库,例如libev或eventfd(2)(或来自GTK / Glib,Qt等的那些库),这些库经常使用{ {1}}(或更高级的东西)。特定于Linux的signalfd(2)和Advanced Linux Programming可能非常有用。
continuation-passing style也很有用。
如果poll
正在进行网络I / O,您可能需要围绕某个事件循环重新设计程序(可能是您自己的,基于poll
) - 您需要多路复用(即{ {1}})网络发送和网络接收。 {{3}}是一个有用的范例。