最近在做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方法卻出了很多問題。
比如當按住按鍵的時候,或者觸控螢幕幕的時候,很容易造成程式關閉。。不知道原因,希望有人指點一二~
所以還是老老實實的用第一種方法吧。