Linux下的两种timer方法 (Android 下NDK开发)
2010-09-13 15:00
866 查看
最近在做android下JNI纯C开发时,用到了timer,如果从java走可能太慢,就想着用linux里面的api,找到两种实现:
1:
struct itimerval tick;
int ret = 0 ;
signal(SIGALRM, sigroutine);
systime_idx = idx;
tick.it_value.tv_sec = 10; //十秒钟后将启动定时器
tick.it_value.tv_usec =100*1000;//100毫秒
tick.it_interval.tv_sec =1; //定时器启动后,每隔1秒将执行相应的函数
tick.it_interval.tv_usec = 0;
ret = setitimer(ITIMER_REAL , &tick, NULL);//ITIMER_REAL
if ( ret != 0)
{
//DEBUG("TIMER ERROR");
}
这一种很传统,顺序是先跑完tick.it_value.tv_sec 的值,然后再跑完tick.it_value.tv_usec 的值(注意:这个单位是微秒,所以毫秒要乘以1000)
然后判断如果tick.it_interval里面不为0的话,则每过N秒后循环调用。
当timer到了的时候会发送SIGALRM 的signal,然后调用sigroutine函数,这个函数定义类型为 void (fun*)(int ID);
注意点:tick.it_value 必须有值,如果为0则无效timer。
如果想只循环一次就把tick.it_interval两个值设置为0。
2:
struct itimerval itimer;
//systime_idx = idx;
itimer.it_interval.tv_sec = 0;
itimer.it_interval.tv_usec =0;
itimer.it_value.tv_sec = 0;
itimer.it_value.tv_usec = 0;
setitimer(ITIMER_REAL, &itimer, NULL);
sigset_t block_mask;
//屏蔽所有不用的信号
sigfillset(&block_mask);
sigdelset(&block_mask, SIGALRM);
sigprocmask(SIG_BLOCK, &block_mask, NULL);
//sigaction
struct sigaction sigact;
sigfillset(&sigact.sa_mask);
sigact.sa_handler=sigroutine;
sigaction(SIGALRM, &sigact, NULL);
这种方法比较高级,乍看起来很相似,但是用起来这个2方法却出了很多问题。
比如当按住按键的时候,或者触摸屏幕的时候,很容易造成程序关闭。。不知道原因,希望有人指点一二~
所以还是老老实实的用第一种方法吧。
1:
struct itimerval tick;
int ret = 0 ;
signal(SIGALRM, sigroutine);
systime_idx = idx;
tick.it_value.tv_sec = 10; //十秒钟后将启动定时器
tick.it_value.tv_usec =100*1000;//100毫秒
tick.it_interval.tv_sec =1; //定时器启动后,每隔1秒将执行相应的函数
tick.it_interval.tv_usec = 0;
ret = setitimer(ITIMER_REAL , &tick, NULL);//ITIMER_REAL
if ( ret != 0)
{
//DEBUG("TIMER ERROR");
}
这一种很传统,顺序是先跑完tick.it_value.tv_sec 的值,然后再跑完tick.it_value.tv_usec 的值(注意:这个单位是微秒,所以毫秒要乘以1000)
然后判断如果tick.it_interval里面不为0的话,则每过N秒后循环调用。
当timer到了的时候会发送SIGALRM 的signal,然后调用sigroutine函数,这个函数定义类型为 void (fun*)(int ID);
注意点:tick.it_value 必须有值,如果为0则无效timer。
如果想只循环一次就把tick.it_interval两个值设置为0。
2:
struct itimerval itimer;
//systime_idx = idx;
itimer.it_interval.tv_sec = 0;
itimer.it_interval.tv_usec =0;
itimer.it_value.tv_sec = 0;
itimer.it_value.tv_usec = 0;
setitimer(ITIMER_REAL, &itimer, NULL);
sigset_t block_mask;
//屏蔽所有不用的信号
sigfillset(&block_mask);
sigdelset(&block_mask, SIGALRM);
sigprocmask(SIG_BLOCK, &block_mask, NULL);
//sigaction
struct sigaction sigact;
sigfillset(&sigact.sa_mask);
sigact.sa_handler=sigroutine;
sigaction(SIGALRM, &sigact, NULL);
这种方法比较高级,乍看起来很相似,但是用起来这个2方法却出了很多问题。
比如当按住按键的时候,或者触摸屏幕的时候,很容易造成程序关闭。。不知道原因,希望有人指点一二~
所以还是老老实实的用第一种方法吧。
相关文章推荐
- linux下android开发环境搭建及NDK安装(转)
- Android TV开发之日期获取的两种方法
- Android-NDK开发之基础--Android JNI开发高级篇(JNI中的常用方法)
- Android开发12——Andorid中操作数据库的insert的两种方法以及nullColumnHack
- 【android开发】保持屏幕长亮的两种方法
- Android-使用C++实现调用本地方法返回字符串显示在界面上/NDK-JNI开发实例(八)
- Android应用:Service开发实例(二)之Service的两种创建方法和其生命周期
- Android开发:获取屏幕宽和高的两种方法(px、dip、分辨率之间的关系及px与dip互相转化)
- Android-NDK开发之基础--Android JNI开发高级篇(JNI中的常用方法)
- linux下android开发环境搭建及NDK安装(转)
- linux下android开发环境搭建及NDK安装
- Android-NDK开发之基础--Android JNI实例代码(一)-- 在JNI中执行Java方法--C/C++调用Java
- Android-本地方法与Java相互调用-自定义ProgressBar(锅炉压力监测例子)/NDK-JNI开发实例(七)
- android与JAVAEE结合开发的关键代码(json与xml两种方法)
- Android开发:获取屏幕宽和高的两种方法(px、dip、分辨率之间的关系及px与dip互相转化)
- Windos下Android(ADT Bundle)配置NDK的两种方法------ADT、Cygwin、NDK配置汇总
- [转]Android通过NDK调用JNI,使用opencv做本地c++代码开发配置方法
- Android开发:用getDrawingCache方法获取ImageView中的图像需要注意的问题 本篇文章来源于 Linux公社网站(www.linuxidc.com) 原文链接:http:/
- Android Studio NDK开发之一(Java调用C的方法)
- linux下android开发环境搭建及NDK安装(转)