Linux 定时器c++实现

lanneret1234 2011-07-27 06:06:51
了解了一下linux下的定时器实现,

signal(SIGALRM, sigalrm_handler);
setitimer(ITIMER_REAL, &itv, &oldtv);

signal(SIGALRM,func);
alarm(2);
定时器处理器都是一个函数,
在这请教一下大家在Linux下如何实现像ACE那样的定时器,就是可以注册的是一个类,当时间到时就会调用类的函数
如;


class TimerHandler
{
public:
virtual void Timer() = 0;
};

class MyTimerHandler: public TimerHandler
{
public:
virtual void Timer()
{
cout<< "Timer" << endl;
}
};

MyTimerHandler m_MyTimerHandler;


RegisterTimer(&m_MyTimerHandler, 10);


每隔10毫秒就会调用一次MyTimerHandler的Timer函数
...全文
1032 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
lanneret1234 2011-07-28
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 justkk 的回复:]
不了解
把类的方法定义为static,是不是就可以被signal使用了?
[/Quote]
把类的方法定义为static,static方法是类所有,而且只能static对象才能调用,那多个定时器对象都是调用同一个static方法,我的构想是每次时间到时就调用定时器对象的方法,这样才能每个定时器都可以有自己的处理过程
lanneret1234 2011-07-28
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 mfc11 的回复:]
加一个线程
线程里用一个while循环,循环里面调用timer(),sleep(10)
[/Quote]
觉的sleep的精度不行,而且我是想同时注册多个定时器,他的时间可能是10毫秒,也可能是100秒,还要考虑线程切换的花费
lanneret1234 2011-07-28
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 freezezdj 的回复:]
select/epoll + 小顶堆。
看看 libevent 的实现。
[/Quote]
大哥可否详细点, 是利用select/epoll超时功能和小顶堆取得最近到时间的那个定时器的功能结合实现吗??
还是。。。。。
justkk 2011-07-28
  • 打赏
  • 举报
回复
不了解
把类的方法定义为static,是不是就可以被signal使用了?
mfc11 2011-07-28
  • 打赏
  • 举报
回复
加一个线程
线程里用一个while循环,循环里面调用timer(),sleep(10)
冻结 2011-07-28
  • 打赏
  • 举报
回复
select/epoll + 小顶堆。
看看 libevent 的实现。
lanneret1234 2011-07-28
  • 打赏
  • 举报
回复


顶!!求意见!!求包养!!
夹心饼干 2011-07-28
  • 打赏
  • 举报
回复
一般我们都是用多线程来实现,至于精度跟线程里sleep的精度没关系
总是用当前的系统时间或者距离格林威治时间的偏移减去定时器起始的时间,你可以把
这个精度调高就行。
至于多个定时器的问题,你把设计的定时器的函数的句柄保存起来,在主线程遍历

原理linux和win下是一样的,只不过貌似win下目前能够提供更高的精度(以CPU的滴答次数为标志)
一叶之舟 2011-07-27
  • 打赏
  • 举报
回复
linux下还没写过类似的定时器,一般都用线程实现。
nightkids_008 2011-07-27
  • 打赏
  • 举报
回复
学习了。。。楼主V5

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧