Linux下的两种timer方法 (Android 下NDK开发)

来源:互联网 发布:淘宝咸鱼会不会被骗 编辑:程序博客网 时间:2024/05/21 18:50

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

 

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

所以还是老老实实的用第一种方法吧。

 

原创粉丝点击