最近在做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方法却出了很多问题。
比如当按住按键的时候,或者触摸屏幕的时候,很容易造成程序关闭。。不知道原因,希望有人指点一二~
所以还是老老实实的用第一种方法吧。