如何实现多定时器?

key20003 2004-08-18 03:51:11
怎么样实现或者模拟多定时器的操作,alarm和signal行吗
...全文
256 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
key20003 2004-08-19
  • 打赏
  • 举报
回复
谢谢,我看暂时也只能那样了,linux下面文档少的可怜,好多东西也只能在低层次上弄弄,唉!!
samstay 2004-08-19
  • 打赏
  • 举报
回复
你可以用1个TIMER来计时,最小单位自己定,然后用一个全局来作为多计时器标志,alarm来了就轮询一下,哪个到时候了,原理很简单.
key20003 2004-08-19
  • 打赏
  • 举报
回复
靠,这种例子我看的多了,且不说它到底和多定时器有什么关系,我看你发的例子自己都没试过,哪里复制了一段就贴了上来,真以为人家是菜鸟啊。
wxywh 2004-08-19
  • 打赏
  • 举报
回复
1、偶贴的代码只是定时器的基本部分,当然还要结合其他的函数来实现多定时器,这一段代码是从偶现在的项目中copy出来的,客户已经为该项目付款了,相信已经经过实践的检验了,呵呵。
2、tonywxd(阿董) 说的方法偶在一个用到定时器的动态库函数中有实现,该方法也可以实现多定时器。
vctony 2004-08-19
  • 打赏
  • 举报
回复
你用此函数试试吧,
gettimeofday();
该函数返回的是自1970年1月1日00时00分00秒以来经过的秒数和微秒数,你可以把返回的值记几个下来作为初值,再定义几个超时时长,哪个超时就调度哪个,哪个被调度了,就更新其初值.
这种方法可以欺骗LINUX内核,在你的进程中实现多线程.
我的老板实现过,可惜我没学到手.
wxywh 2004-08-18
  • 打赏
  • 举报
回复
给个例子:
void TimeStart(int sec,int usec,int i_sec,int i_usec)
{
struct sigaction TimeSignal;
struct itimerval ivalue,ovalue;

TimeSignal.sa_handler = TimeCount;
sigemptyset(×ignal.sa_mask);
TimeSignal.sa_flags = 0;
sigaction(SIGALRM,×ignal,NULL);
ivalue.it_interval.tv_sec = sec;
ivalue.it_interval.tv_usec = usec;
ivalue.it_value.tv_sec = i_sec;
ivalue.it_value.tv_usec = i_usec;
setitimer(ITIMER_REAL,&ivalue,&ovalue);
}

static void TimeCount(int signo)
{
int i;

++DelayCount;
++RecvDLECount;
}
key20003 2004-08-18
  • 打赏
  • 举报
回复
linux多定时器的问题好麻烦啊,我想干脆自己模拟下算了
把定时器的时间间隔划定的足够小,是所有定时间隔的最大公约数
然后在定时时间到处理程序中可以做多个定时,比如
我只有有一个秒级定时器,你就可以做5、20、30秒......的定时器,里面在用个map什么的东西匹配,感觉是行的,大家说说我这个方案可以吗,有什么要注意的地方
collide 2004-08-18
  • 打赏
  • 举报
回复
alarm实际上是使用SIGALARM信号,只能实现一个定时器,因为多次调用alarm(),它(alarm())会清楚以前的设定。

应该是不行,据我所知。
你可以看看apue(unix环境高级编程,信号那一章,说的很清楚),那个作者的观点好像也是不可一,同样因为以上的原因。

23,126

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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