0

如何在一秒钟内调用一个方法/函数 50 次然后计算花费的时间,如果花费的时间少于一秒,那么睡眠 (1-timespent) 秒。

下面是伪代码

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,我必须使用它来实现这一点。我想要可移植的代码。

4

1 回答 1

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或将其传递给您的事件循环)。

您可能想要使用一些现有的事件循环库,例如libeventlibev(或来自 GTK/Glib、Qt 等的那些),它们经常使用poll(或更高级的东西)。linux 特定的eventfd(2)signalfd(2)可能会很有帮助。

高级 Linux 编程阅读也很有用。

如果send_msg正在执行网络 I/O,您可能需要围绕某个事件循环(可能是您自己的,基于poll)重新设计您的程序 - 您需要poll在网络发送和网络接收上进行多路复用(即)。延续传递风格是一个有用的范例。

于 2013-10-12T06:28:28.233 回答