linux中的计时器类

时间:2009-02-02 16:46:23

标签: c++ linux timer

我需要一个计时器来执行分辨率相对较低的回调。在Linux中实现这样的C ++计时器类的最佳方法是什么?有没有我可以使用的图书馆?

5 个答案:

答案 0 :(得分:14)

如果你在一个框架内编写(Glib,Qt,Wx,...),你就已经有了一个带有定时回调功能的事件循环。我认为情况并非如此。

如果您正在编写自己的事件循环,则可以使用gettimeofday / select对(struct timeval,微秒精度)或clock_gettime / {{1为您自己的事件调度程序配对(nanosleep,纳秒精度)。尽管后一种界面具有更高的分辨率,但无论如何,调度都不会那么准确,所以要采取最适合的方式。

struct timespec

警告:我爱C.我从不写C ++。我只是假装知道这种语言。

免责声明:刚才写的,完全未经测试。基本思想是将事件保存在优先级队列中,等到第一个队列,运行它,然后重复。

答案 1 :(得分:7)

使用boost :: asio库。它有同步和异步定时器,可以调用回调。

http://www.boost.org/doc/libs/1_37_0/doc/html/boost_asio/tutorial.html

答案 2 :(得分:0)

尝试在time.h中定义的clock_gettime()函数:

int clock_gettime(clockid_t clk_id, struct timespec *tp);

struct timespec {
  time_t   tv_sec;        /* seconds */
  long     tv_nsec;       /* nanoseconds */
};

通常你可以这样称呼它:

struct timespec ts;
clock_gettime(CLOCK_REALTIME, &ts);

答案 3 :(得分:0)

time.h标头中的timeval结构是您正在寻找的。它有几秒和几纳秒的时间。因此,以纳秒为单位的总时间是timeval.tv_sec * 1000000 + timeval.tv_usec。我认为很容易。

#include <time.h>
timeval theStartTime;
gettimeofday(&theStartTime);
std::cout<<"The time we got's seconds field = "<<theStartTime.tv_sec<<std::endl;
std::cout<<"The time we got's nanoseconds field =  "<<theStartTime.tv_usec<<std::endl;

答案 4 :(得分:0)

这是一个计时器类的链接。你只需要创建计时器并传递它值以进行自动重新加载。指向回调函数的指针。或者,如果你想让它由线程或信号处理。如果你选择信号,你也必须通过标志。

http://timerlinux.codeplex.com/

如果你想更多地研究定时器或信号,那就有一本叫做linux系统编程的好书。你只需阅读3章并解释所有章节。