日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

【转】Linux Posix Timer使用

發布時間:2024/4/17 linux 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【转】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;??
  • ??
  • ????/*?create?timer?*/??
  • ????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;??
  • ??
  • ????/*?Start?the?timer?*/??
  • ????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;??
  • ????}??
  • ????//?...?完成time?out后要做的工作??
  • }??

  • 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;??
  • ????}??
  • ??
  • ????//?...完成time?out后要做的工作??
  • }??

  • 調用一:

    [cpp]?view plaincopy
  • 創建timer,設定prepareAsyncTimeout??
  • 開始timer,timeout時間為500ms??
  • ??
  • ????????createTimer(&mPrepareAsyncTimer,?prepareAsyncTimeout);??
  • ????????setTimer(&mPrepareAsyncTimer,?500/*ms*/);??

  • 調用二:?

    [cpp]?view plaincopy
  • 創建timer,設定timeout回調函數。??
  • ????//?create?timer??
  • ????if?(mSeekTimer?==?-1)??
  • ????{??
  • ????????createTimer(&mSeekTimer,?seekTimerTimeout);??
  • ????}??
  • ??
  • 判斷mSeekTimer是否有效,有效,計算到timeout的剩余時間,如果還沒到timeout,重置timer,??
  • 開始新的計時。??
  • ????//?if?timer?exist?and?not?expire,?reset?timer.??
  • ????if?(mSeekTimer?!=?-1)??
  • ????{??
  • ????????gulong?remaining?=?0;?//us??
  • ????????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/*ms*/?*?1000?-?remaining)?>?0)??
  • ????????{??
  • ???????????setTimer(&mSeekTimer,?100/*ms*/);??
  • ???????????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使用的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。