【问题标题】:How to call a method/function 50 time in a second如何在一秒钟内调用 50 次方法/函数
【发布时间】:2013-10-20 07:23:59
【问题描述】:

如何在一秒钟内调用一个方法/函数 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,我必须使用它来实现这一点。我想要可移植的代码。

【问题讨论】:

标签: c++ c unix time timer


【解决方案1】:

首先,阅读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 库,例如 libeventlibev(或来自 GTK/Glib、Qt 等的那些),它们经常使用 poll(或更高级的东西) )。 linux 特有的eventfd(2)signalfd(2) 可能会很有帮助。

Advanced Linux Programming 阅读也很有用。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-17
    • 2019-02-01
    • 2020-10-20
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多