您的位置:首页 > 运维架构 > Linux

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方法却出了很多问题。

比如当按住按键的时候,或者触摸屏幕的时候,很容易造成程序关闭。。不知道原因,希望有人指点一二~

所以还是老老实实的用第一种方法吧。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐