我需要一个计时器来执行分辨率相对较低的回调。在Linux中实现这样的C ++计时器类的最佳方法是什么?有没有我可以使用的图书馆?
答案 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章并解释所有章节。