生活随笔
收集整理的這篇文章主要介紹了
【转】Linux Posix Timer使用
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
原文網址:http://blog.csdn.net/hongszh/article/details/8608781
最強大的定時器接口來自POSIX時鐘系列,其創建、初始化以及刪除一個定時器的行動被分為三個不同的函數:timer_create()(創建定時器)、timer_settime()(初始化定時器)以及timer_delete(銷毀它)。
man timer_create/timer_settime,可以看到man幫助的詳細文檔:
?
[cpp]?view plaincopy
TIMER_CREATE(2)??????????????????????????????????????Linux?Programmer's?Manual??????NAME?????????timer_create?-?create?a?POSIX?per-process?timer????SYNOPSIS?????????#include?<signal.h>?????????#include?<time.h>???????????int?timer_create(clockid_t?clockid,?struct?sigevent?*sevp,??????????????????????????timer_t?*timerid);?????????int?timer_settime(timer_t?timerid,?int?flags,???????????????????????????const?struct?itimerspec?*new_value,???????????????????????????struct?itimerspec?*?old_value);?????????int?timer_gettime(timer_t?timerid,?struct?itimerspec?*curr_value);?? ?
我的實現如下:
?
1. 定義timer timeout的函數指針類型:?
[cpp]?view plaincopy
typedef?void?(*timerTimeout)(union?sigval?sig);??
2. 為我們的GstPlayer定義兩個timer ID:
[cpp]?view plaincopy
timer_t??mSeekTimer;??timer_t??mPrepareAsyncTimer;?? ?
3. 定義createTimer函數,創建timer,設置timeout函數
? ? timerId: 輸入輸出參數
? ? func: ? ?timer timeout函數
[cpp]?view plaincopy
void?createTimer(timer_t?*timerId,?timerTimeout?func)??{??????struct?sigevent?sev;????????sev.sigev_notify?=?SIGEV_THREAD;??????sev.sigev_signo?=?SIGRTMIN;??????sev.sigev_value.sival_ptr?=?gPlayer;??????sev.sigev_notify_function?=?func;??????sev.sigev_notify_attributes?=?NULL;????????????if?(timer_create?(CLOCK_REALTIME,?&sev,?timerId)?==?-1)??????{??????????ERR?("timer_create,?error");??????????return;??????}????????if?(*timerId?==?-1)??????????ERR??("timer_create?error,?id?is?-1");??????return;??}?? ?
4. setTimer函數, 調用linux的timer_settime, 如果還沒到time out,重置之前的timer
?
如果已經time out,那就得重新調用createTimer生成有效的timer ID,然后才能調用setTimer開始定時器計時。
-這里,將interval參數設置為0,指定我的定時器不工作在循環模式。
-timeMSec是輸入參數,指定time out的時間,單位為毫秒。
[cpp]?view plaincopy
void?setTimer(timer_t?*timerId,?int?timeMSec)??{??????struct?itimerspec?its;????????????its.it_value.tv_sec?=?timeMSec?/?1000;??????its.it_value.tv_nsec?=?(timeMSec?%?1000)?*?1000000;????????its.it_interval.tv_sec?=?0;??????its.it_interval.tv_nsec?=?0;????????if?(timer_settime?(*timerId,?0,?&its,?NULL)?==?-1)??????{??????????ERR?("timer_settime?error");??????}??????DEBUG?("call?timer_settime?reset?timer?done.");??????return;??}?? ?
seekTimerTimeout函數,time out以后,銷毀之前調用createTimer創建的timer,完成time out后要做的工作
[cpp]?view plaincopy
void?seekTimerTimeout(union?sigval?sig)??{??????GstPlayer?*player?=?(GstPlayerplayer*)sig.sival_ptr;??????if?(player->mSeekTimer?!=?-1)??????{??????????DEBUG("timeout,?delete?timer:Id?=?%d",??????????????????player->mSeekTimer);??????????timer_delete(player->mSeekTimer);??????????player->mSeekTimer?=?-1;??????}??????}??
prepareAsyncTimeout的time out函數:
[cpp]?view plaincopy
void?prepareAsyncTimeout(union?sigval?sig)??{??????GstStateChangeReturn?state_return;??????GstPlayer?*player?=?(GstPlayerplayer*)sig.sival_ptr;????????if?(player->mPrepareAsyncTimer?!=?-1)??????{??????????DEBUG("timeout,?delete?timer:Id?=?%d",??????????????????player->mPrepareAsyncTimer);??????????timer_delete(player->mPrepareAsyncTimer);??????????player->mPrepareAsyncTimer?=?-1;??????}????????}??
調用一:
[cpp]?view plaincopy
創建timer,設定prepareAsyncTimeout??開始timer,timeout時間為500ms????????????createTimer(&mPrepareAsyncTimer,?prepareAsyncTimeout);??????????setTimer(&mPrepareAsyncTimer,?500
調用二:?
[cpp]?view plaincopy
創建timer,設定timeout回調函數。??????????if?(mSeekTimer?==?-1)??????{??????????createTimer(&mSeekTimer,?seekTimerTimeout);??????}????判斷mSeekTimer是否有效,有效,計算到timeout的剩余時間,如果還沒到timeout,重置timer,??開始新的計時。??????????if?(mSeekTimer?!=?-1)??????{??????????gulong?remaining?=?0;?????????struct?itimerspec?its;????????????timer_gettime(mSeekTimer,?&its);??????????remaining?=?its.it_value.tv_sec?*?1000000?????????????????????its.it_value.tv_nsec?/?1000;??????????DEBUG?("--?remaining?time?=?%lu?us",?remaining);??????????if?((100????????{?????????????setTimer(&mSeekTimer,?100???????????DEBUG?("the?new?seek?interval?<?100ms,?return");?????????????mSeekCount?=?1;?????????????return?TRUE;??????????}??????}?? ?
參考:
http://blog.163.com/zheng_he_xiang/blog/static/18650532620116311020390/
http://blog.csdn.net/leo9150285/article/details/8271910
轉載于:https://www.cnblogs.com/wi100sh/p/4281618.html
總結
以上是生活随笔為你收集整理的【转】Linux Posix Timer使用的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。