Linux下的兩種timer方法 (Android 下NDK開發)

來源:互聯網
上載者:User

最近在做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方法卻出了很多問題。

 

比如當按住按鍵的時候,或者觸控螢幕幕的時候,很容易造成程式關閉。。不知道原因,希望有人指點一二~

所以還是老老實實的用第一種方法吧。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.