免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 8758 | 回复: 15
打印 上一主题 下一主题

linux下怎么实现定时器的功能 [复制链接]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-01-23 09:59 |只看该作者 |倒序浏览
好像MFC 中的SetTimer
我在网上看到一篇文章 ,但是好像代码没写完..它是怎么实现利用单线程实现,而且同时还可以处理其他任务的


  1. 最优雅的方法是使用RTC机制。利用select函数,你可以用单线程实现定时器,同时还可以处理其它任务。简单示例:



  2. #include <stdio.h>

  3. #include <linux/rtc.h>

  4. #include <sys/ioctl.h>

  5. #include <sys/time.h>

  6. #include <sys/types.h>

  7. #include <fcntl.h>

  8. #include <unistd.h>

  9. #include <errno.h>



  10. int main(int argc, char* argv[])

  11. {

  12.     unsigned long i = 0;

  13.     unsigned long data = 0;

  14.     int retval = 0;

  15.     int fd = open ("/dev/rtc", O_RDONLY);



  16.     if(fd < 0)

  17.     {

  18.         perror("open");

  19.         exit(errno);

  20.     }



  21.     /*Set the freq as 4Hz*/

  22.     if(ioctl(fd, RTC_IRQP_SET, 4) < 0)

  23.     {

  24.         perror("ioctl(RTC_IRQP_SET)");

  25.         close(fd);

  26.         exit(errno);

  27.     }

  28.     /*Set the freq as 4Hz*/

  29.     if(ioctl(fd, RTC_IRQP_SET, 4) < 0)

  30.     {

  31.         perror("ioctl(RTC_IRQP_SET)");

  32.         close(fd);

  33.         exit(errno);

  34.     }



  35.     /* Enable periodic interrupts */

  36.     if(ioctl(fd, RTC_PIE_ON, 0) < 0)

  37.     {

  38.         perror("ioctl(RTC_PIE_ON)");

  39.         close(fd);

  40.         exit(errno);

  41.     }



  42.     for(i = 0; i < 100; i++)

  43.     {

  44.         if(read(fd, &data, sizeof(unsigned long)) < 0)

  45.         {

  46.             perror("read");

  47.             close(fd);

  48.             exit(errno);

  49.         }

  50.         printf("timer\n");

  51.     }

  52.     /* Disable periodic interrupts */

  53.     ioctl(fd, RTC_PIE_OFF, 0);

  54.     close(fd);



  55.     return 0;

  56. }
复制代码

论坛徽章:
0
2 [报告]
发表于 2007-01-23 12:30 |只看该作者
楼主可以有很多方法

1、 间隔固定时间发送信号,然后捕获这个信号,处理他
2、 间隔固定时间,执行某件事

论坛徽章:
0
3 [报告]
发表于 2007-01-23 12:41 |只看该作者
man setitimer

论坛徽章:
0
4 [报告]
发表于 2007-01-23 13:37 |只看该作者
用select / poll 都可以实现。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
5 [报告]
发表于 2007-01-23 15:53 |只看该作者
如果我一个工程同时使用好几个定时器呢..二楼的说法可行吗.

4楼能详细说一下怎么实现吗...如果是用select 的话..还是要单独启一下线程吧..
单线程怎么实现呢,而且同时还要处理其他任务

论坛徽章:
0
6 [报告]
发表于 2007-01-23 16:11 |只看该作者
弄个链表之类的东西管理所有的定时器,添加/删除定时器/定时器到时的时候,把下一次定时信号的时间相应调整。

论坛徽章:
0
7 [报告]
发表于 2007-01-23 16:20 |只看该作者
没研究过,在linux-2.6.xx/Documentation/rtc.txt中有一个示例代码可以参看

论坛徽章:
0
8 [报告]
发表于 2007-01-23 17:10 |只看该作者
研究一下ACE即可

论坛徽章:
0
9 [报告]
发表于 2007-01-23 17:27 |只看该作者
采用多个线程或进程同时运行,用信号控制他们的启动或者运行。

我曾经在学信号的时候做过DEMO,同时控制不到10个进程

更大一点的程序我没有用到过

论坛徽章:
0
10 [报告]
发表于 2007-01-23 20:04 |只看该作者
ACE中有定时器队列的完美实现,基于线程的定时器队列的适配器等等,建议参看它的源码。那是相当的
不错。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP