怎么实现一个定时器?
来源:互联网 发布:免费售楼软件 编辑:程序博客网 时间:2024/05/17 05:16
为了实现精确定时器,一般做法是使用函数setitimer定时触发SIGALRM来打点计时;看下面代码:
#define TIMER_INTERVAL 1unsigned int elapsed;void catch_alarm(int sig){ elapsed++; return;}void initTimer(void){ struct itimerval itimer; ptp_dbgPrint("initTimer\n"); signal(SIGALRM, SIG_IGN); itimer.it_value.tv_sec = TIMER_INTERVAL; itimer.it_value.tv_usec = 0; itimer.it_interval.tv_sec = 0; itimer.it_interval.tv_usec = 10*1000; signal(SIGALRM, catch_alarm); setitimer(ITIMER_REAL, &itimer, 0); return;}
通过这段代码,可以初始化一个定时器,设置超时时间1s,然后每隔1s执行一次,这样就可以得到一个每隔1s计数一次的变量elapsed,根据这个数值的大小就知道过去了几秒了。然而在一个比较大的项目中,这个定时器一般不能使用,为什么呢?因为信号量SIGALRM会打断sleep函数和select函数,这样当想在程序中使用sleep或者在socket编程中使用select进行端口数据检查时,就会经常被打断;显然这样是不行的。有没有其他解决办法呢?当然有,使用select及时,这个是一个常用方法。继续看代码:
#define TIMER_INTERVAL 1unsigned int elapsed;void *initTick(void *arg){ BYTE index = 0; struct timeval tv; while(1){ tv.tv_sec = TIMER_INTERVAL; tv.tv_usec = 0; select(0,NULL,NULL,NULL,&tv); elapsed++; } return NULL;}int create_thread(void){ int ret = 0; pthread_t p_thread; pthread_attr_t attr; pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED); ret = pthread_create(&p_thread,&attr,initTick,NULL); pthread_attr_destroy (&attr); return ret;}
这样我通过启动一个线程,来使用select超时控制来计数,这样就可以完美实现定时器了。
1 0
- 怎么实现一个定时器?
- Python定时器的一个实现
- 一个动画怎么实现
- [Java定时器]用Spring Task实现一个简单的定时器.
- LINUX使用一个定时器实现设置任意数量定时器
- 用javascript实现的一个定时器
- 用python的tiwsted实现一个定时器
- 定时器实现动画的一个例子
- 一个简单定时器的实现(C++)
- 基于HashedWheelTimer的一个定时器实现
- 一个简单定时器的实现(C++)
- windows客户端开发--实现一个多线程定时器
- 如何用python实现一个多线程定时器
- js定时器怎么写
- 使用MyEclips在一个包下建包,怎么实现
- 怎么用两个堆栈实现一个队列?
- 定时器 实现
- 定时器实现
- cc150:字符串:1.3
- Java并发编程:Lock
- Populating Next Right Pointers in Each Node II
- core dump调试
- 拷贝标准的选择屏幕修改为自定义的样式
- 怎么实现一个定时器?
- jq 淡入淡出 滑动 焦点等实际使用
- Http长连接、短连接、持久连接这三个概念的分析总结
- 使用SpringBoot快速构建应用程序
- Mac使用zsh导致maven命令无效的解决方案
- 【Java】内部类与外部类的互访使用小结
- php-代码优化准则
- 如何在项目启动的时候做一些业务处理 (实现ServletContextListener)
- HTML5 - 用<figure/>添加插图和图题