【转】Linux Posix Timer使用
原文网址:http://blog.csdn.net/hongszh/article/details/8608781
最强大的定时器接口来自POSIX时钟系列,其创建、初始化以及删除一个定时器的行动被分为三个不同的函数:timer_create()(创建定时器)、timer_settime()(初始化定时器)以及timer_delete(销毁它)。
man timer_create/timer_settime,可以看到man帮助的详细文档:
- TIMER_CREATE(2) Linux Programmer's Manual
- NAME
- timer_create - create a POSIX per-process timer
- SYNOPSIS
- #include <signal.h>
- #include <time.h>
- int timer_create(clockid_t clockid, struct sigevent *sevp,
- timer_t *timerid);
- int timer_settime(timer_t timerid, int flags,
- const struct itimerspec *new_value,
- struct itimerspec * old_value);
- int timer_gettime(timer_t timerid, struct itimerspec *curr_value);
我的实现如下:
1. 定义timer timeout的函数指针类型:
- typedef void (*timerTimeout)(union sigval sig);
2. 为我们的GstPlayer定义两个timer ID:
- timer_t mSeekTimer;
- timer_t mPrepareAsyncTimer;
3. 定义createTimer函数,创建timer,设置timeout函数
timerId: 输入输出参数
func: timer timeout函数
- void createTimer(timer_t *timerId, timerTimeout func)
- {
- struct sigevent sev;
- sev.sigev_notify = SIGEV_THREAD;
- sev.sigev_signo = SIGRTMIN;
- sev.sigev_value.sival_ptr = gPlayer;
- sev.sigev_notify_function = func;
- sev.sigev_notify_attributes = NULL;
- /* create timer */
- if (timer_create (CLOCK_REALTIME, &sev, timerId) == -1)
- {
- ERR ("timer_create, error");
- return;
- }
- if (*timerId == -1)
- ERR ("timer_create error, id is -1");
- return;
- }
4. setTimer函数, 调用linux的timer_settime, 如果还没到time out,重置之前的timer
如果已经time out,那就得重新调用createTimer生成有效的timer ID,然后才能调用setTimer开始定时器计时。
-这里,将interval参数设置为0,指定我的定时器不工作在循环模式。
-timeMSec是输入参数,指定time out的时间,单位为毫秒。
- void setTimer(timer_t *timerId, int timeMSec)
- {
- struct itimerspec its;
- /* Start the timer */
- its.it_value.tv_sec = timeMSec / 1000;
- its.it_value.tv_nsec = (timeMSec % 1000) * 1000000;
- its.it_interval.tv_sec = 0;
- its.it_interval.tv_nsec = 0;
- if (timer_settime (*timerId, 0, &its, NULL) == -1)
- {
- ERR ("timer_settime error");
- }
- DEBUG ("call timer_settime reset timer done.");
- return;
- }
seekTimerTimeout函数,time out以后,销毁之前调用createTimer创建的timer,完成time out后要做的工作
- void seekTimerTimeout(union sigval sig)
- {
- GstPlayer *player = (GstPlayerplayer*)sig.sival_ptr;
- if (player->mSeekTimer != -1)
- {
- DEBUG("timeout, delete timer:Id = %d",
- player->mSeekTimer);
- timer_delete(player->mSeekTimer);
- player->mSeekTimer = -1;
- }
- // ... 完成time out后要做的工作
- }
prepareAsyncTimeout的time out函数:
- void prepareAsyncTimeout(union sigval sig)
- {
- GstStateChangeReturn state_return;
- GstPlayer *player = (GstPlayerplayer*)sig.sival_ptr;
- if (player->mPrepareAsyncTimer != -1)
- {
- DEBUG("timeout, delete timer:Id = %d",
- player->mPrepareAsyncTimer);
- timer_delete(player->mPrepareAsyncTimer);
- player->mPrepareAsyncTimer = -1;
- }
- // ...完成time out后要做的工作
- }
调用一:
- 创建timer,设定prepareAsyncTimeout
- 开始timer,timeout时间为500ms
- createTimer(&mPrepareAsyncTimer, prepareAsyncTimeout);
- setTimer(&mPrepareAsyncTimer, 500/*ms*/);
调用二:
- 创建timer,设定timeout回调函数。
- // create timer
- if (mSeekTimer == -1)
- {
- createTimer(&mSeekTimer, seekTimerTimeout);
- }
- 判断mSeekTimer是否有效,有效,计算到timeout的剩余时间,如果还没到timeout,重置timer,
- 开始新的计时。
- // if timer exist and not expire, reset timer.
- if (mSeekTimer != -1)
- {
- gulong remaining = 0; //us
- struct itimerspec its;
- timer_gettime(mSeekTimer, &its);
- remaining = its.it_value.tv_sec * 1000000
- its.it_value.tv_nsec / 1000;
- DEBUG ("-- remaining time = %lu us", remaining);
- if ((100/*ms*/ * 1000 - remaining) > 0)
- {
- setTimer(&mSeekTimer, 100/*ms*/);
- DEBUG ("the new seek interval < 100ms, return");
- mSeekCount = 1;
- return TRUE;
- }
- }
参考:
http://blog.163.com/zheng_he_xiang/blog/static/18650532620116311020390/
http://blog.csdn.net/leo9150285/article/details/8271910
【转】Linux Posix Timer使用的更多相关文章
- Linux时间子系统之(六):POSIX timer
专题文档汇总目录 Notes:首先讲解了POSIX timer的标识(唯一识别).POSIX Timer的组织(管理POSIX Timer).内核中如何抽象POSIX Timer:然后分析了POSIX ...
- Linux时间子系统(六) POSIX timer
一.前言 在用户空间接口函数文档中,我们描述了和POSIX timer相关的操作,主要包括创建一个timer.设定timer.获取timer的状态.获取timer overrun的信息.删除timer ...
- Linux posix线程库总结
由于历史原因,2.5.x以前的linux对pthreads没有提供内核级的支持,所以在linux上的pthreads实现只能采用n:1的方式,也称为库实现. 线程的实现,经历了如下发展阶段: Linu ...
- POSIX Timer
SYNOPSIS #include <signal.h> /* only timer_create need this header */ #include <time.h> ...
- linux POSIX 信号量介绍
信号量一.什么是信号量信号量的使用主要是用来保护共享资源,使得资源在一个时刻只有一个进程(线程)使用.多线程可以同时运行多个线程函数完成功能,但是对于共享数据如果不加以锁定,随意改变共享数据的值会发生 ...
- linux Posix 信号量 一
信号量是一种用于提供不同进程间或一个给定进程的不同线程间同步手段的原语. linux提供两种信号量,“内核信号量”和“用户态进程信号量”,“用户态信号量”又分为“Posix”,“System V”信号 ...
- linux Posix线程同步(条件变量) 实例
条件变量:与互斥量一起使用,暂时申请不到某资源时进入条件阻塞等待,当资源具备时线程恢复运行 应用场合:生产线程不断的生产资源,并通知产生资源的条件,消费线程在没有资源情况下进入条件等待,一直等到条件信 ...
- linux Posix 信号量 二
一.Posix信号量 1.Posix信号量分为两种: 1. 有名信号量:使用Posix IPC名字标识(有名信号量总是既可用于线程间的同步,又可以用于进程间的同步) 2. 内存信号量:存放在共 ...
- linux POSIX信号量
POSIX信号量机制是3种IPC机制之一,3种IPC机制源于POSIX.1的实时扩展. 创建一个新的命名信号量或者使用一个现有信号量 #include <fcntl.h> #include ...
随机推荐
- make -f dc_debug.mak 提示错误"/usr/bin/ld:can not find -l***"解决办法
在公司不同服务器上"make -f ***"程序的时候,有的服务器可以编译通过,有的却提示"/usr/bin/ld:can not find -l***"的错误 ...
- Splay树再学习
队友最近可能在学Splay,然后让我敲下HDU1754的题,其实是很裸的一个线段树,不过用下Splay也无妨,他说他双旋超时,单旋过了,所以我就敲来看下.但是之前写的那个Splay越发的觉得不能看,所 ...
- .net web部署(IIS Express && Nancy Self-Hosting)
http://d.hatena.ne.jp/fkmt5/20140330/1396195246 [1]Nancy Web配置注意事项 添加url:netsh http add urlacl url=h ...
- iOS开发--数组
1.sortedArrayUsingSelector (按Key值大小对NSDictionary排序) NSMutableArray *array = [NSMutableArray arrayWit ...
- 用 React 编写SVG图表
1.代码 <!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="U ...
- C++:调整基类成员在派生类中的访问属性的其他方法(同名成员和访问声明)
4.3 调整基类成员在派生类中的访问属性的其他方法 4.3.1 同名函数 在定义派生类的时候,C++语言允许在派生类中说明的成员与基类中的成员名字相同,也就是 说,派生类可以重新说明与基类成员同名的成 ...
- (转)Spring的编程式事务例子
纯JDBC操作, 对某些项目来说, 也许更好, Spring JDBC Framework让你不用关心Connection, Statement, ResultSet. 定义数据源 spring事务编 ...
- php库Faker
Faker License : MIT Source Code Allo点评:Faker是一个很神奇的项目,会自动生成拟真的数据,包括用户资料.长文本.IP.日期等等,在网站上线前测试时非常好用. g ...
- Tomcat原理 分类: 原理 2015-06-28 19:26 5人阅读 评论(0) 收藏
Tomcat的模块结构设计的相当好,而且其Web 容器的性能相当出色.JBoss直接就使用了Tomcat的web容器,WebLogic的早期版本也是使用了Tomcat的代码. Web容器的工作过程在下 ...
- 新装的win7 64位系统上装了IE11,想调试网页的时候,按F12,工具会出来,但是没法正常使用,出现空白。
Windows专区开了一帖,没人应.这边再开一帖,看看各位遇到过没.如题,新装的win7 64位系统上装了IE11,想调试网页的时候,按F12,工具会出来,但是没法正常使用.尤其是想切换文档模式,只能 ...