青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

牽著老婆滿街逛

嚴以律己,寬以待人. 三思而后行.
GMail/GTalk: yanglinbo#google.com;
MSN/Email: tx7do#yahoo.com.cn;
QQ: 3 0 3 3 9 6 9 2 0 .

簡析LIVE555中的延時隊列

轉載自:http://blog.sina.com.cn/s/blog_77c6324101018j1k.html

最近在看LIVE555的源碼,對其中的延時隊列感覺有點亂,網上查詢資料,于是就總結一下。

首先描述一下LIVE555中的延時隊列的設計理念。如下圖,A,B,C分別為時間軸上的三個事件點,而head表示當前時間點。

要描述一個事件發生的時間,通常可以有兩種方法:一種方法直接描述事件發生的絕對時間;另一種方法則是可以描述和另一事件發生的相對時間。而LIVE555中采用的就是后者。  

LIVE555中,首先將所有的事件點以發生時間的先后進行排序,然后每個事件對應的時間都是相對于前一事件發生的時間差。比如B事件中存儲的時間就是A事件觸發后,再去觸發B事件所需要的時間。這樣,我們每次去查詢這個隊列中是否有事件被觸發的時候,就只需要查詢整個隊列中的第一個事件就可以了。

 然后就是LIVE555中的實現方法了。整個延時隊列是用DelayQueue這個類實現的,而它的基類DelayQueueEntry就是用來描述每個事件節點的。在DelayQueueEntry中的主要成員有以下幾個:fDelayTimeRemaining表示的就是與前一事件之間的時間差;fNextfPrev就是指向時間軸上的下一個事件和前一個事件的指針;ftoken表示當前節點的標識;handleTimeout就是事件超時后的處理方法。

DelayQueue類里描述的則是具體的實現方法。首先是一些對這個隊列進行的基本操作:addEntry實現的是在隊列中增加事件節點removeEntry實現的是在隊列中刪除某事件節點;updateEntry實現的則是更新某事件的觸發時間;而findEntryByToken則是根據節點的標識查找相應的事件。在此類中最常用的方法應該是synchronize,它實現的就是將整個事件隊列和當前系統時間進行同步,檢測有無事件已經被觸發,如果觸發并調用handleAlarm方法對相應事件進行處理。而屬性fLastSyncTime表示的就是上次同步的系統時間,其實一般情況下,方法synchronize的實現方法其實就是簡單地把隊列上第一個事件節點存儲的時間差減去當前系統時間和上次同步時間的差。

附:相關類結構:

=================================================================

==> 相關typedef定義

typedef void TaskFunc(void* clientData);

typedef void* TaskToken;

// 下面Timeval類有涉及

#ifdef TIME_BASE

typedef TIME_BASE time_base_seconds;

#else

typedef long time_base_seconds;

#endif

==> 相關類的說明(由于有些類很大,故不會完整貼出,故用說明)

///// A "Timeval" can be either an absolute time, or a time interval /////

class Timeval {

public:

  time_base_seconds seconds() const {

    return fTv.tv_sec;

  }

  time_base_seconds seconds() {

    return fTv.tv_sec;

  }

  time_base_seconds useconds() const {

return fTv.tv_usec;

  }

int operator>=(Timeval const& arg2) const; // >=為基礎,推算出其余條件判斷(<=<</span>、>等)的真假

  int operator<=(Timeval const& arg2) const {

    return arg2 >= *this;

  }

  int operator<</b>(Timeval const& arg2) const {

    return !(*this >= arg2);

  } 

int operator>(Timeval const& arg2) const {

    return arg2 < *this;

  }

  int operator==(Timeval const& arg2) const {

    return *this >= arg2 && arg2 >= *this;

  }

  int operator!=(Timeval const& arg2) const {

    return !(*this == arg2);

  }

  void operator+=(class DelayInterval const& arg2);

  void operator-=(class DelayInterval const& arg2);

  // returns ZERO iff arg2 >= arg1

protected:

  Timeval_r(time_base_seconds seconds, time_base_seconds useconds) {

    fTv.tv_sec = seconds; fTv.tv_usec = useconds;

  }

private:

  time_base_seconds& secs() {

    return (time_base_seconds&)fTv.tv_sec;

  }

  time_base_seconds& usecs() {

    return (time_base_seconds&)fTv.tv_usec;

  }

  struct timeval fTv; // 看到,所有的所有,其實是在為timeval這個結構體封裝了一系列操作函數

};

++++++++++++++++++++++++++++++++++++++++++

// 下面這個類用以處理自197011日以來的絕對時間

class EventTime: public Timeval {

public:

  EventTime(unsigned secondsSinceEpoch = 0,

    unsigned usecondsSinceEpoch = 0)

    // We use the Unix standard epoch: January 1, 1970

    : Timeval_r(secondsSinceEpoch, usecondsSinceEpoch) {}

};

class DelayQueueEntry { // 通過它來鏈接所有的事件信息,組成隊列(見下面DelayQueue類)

public:

  virtual ~DelayQueueEntry();

  intptr_t token() {

    return fToken;

  }

protected: // abstract base class

  DelayQueueEntry(DelayInterval delay);

  virtual void handleTimeout();

private:

  friend class DelayQueue;

  DelayQueueEntry* fNext;

  DelayQueueEntry* fPrev;

  DelayInterval fDeltaTimeRemaining;

  intptr_t fToken;

  static intptr_t tokenCounter;

};

class DelayQueue: public DelayQueueEntry {

public:

  DelayQueue();

  virtual ~DelayQueue();

  void addEntry(DelayQueueEntry* newEntry); // returns a token for the entry

  void updateEntry(DelayQueueEntry* entry, DelayInterval newDelay);

  void updateEntry(intptr_t tokenToFind, DelayInterval newDelay);

  void removeEntry(DelayQueueEntry* entry); // but doesn't delete it

  DelayQueueEntry* removeEntry(intptr_t tokenToFind); // but doesn't delete it

  DelayInterval const& timeToNextAlarm();

  void handleAlarm();

private:

  DelayQueueEntry* head() { return fNext; } // 返回DelayQueueEntry類中的fNext隊頭成員

  DelayQueueEntry* findEntryByToken(intptr_t token);

  void synchronize(); // bring the 'time remaining' fields up-to-date

  EventTime fLastSyncTime;

};

////////// A subclass of DelayQueueEntry,

//////////     used to implement BasicTaskScheduler0::scheduleDelayedTask()

class AlarmHandler: public DelayQueueEntry {

public:

  AlarmHandler(TaskFunc* proc, void* clientData, DelayInterval timeToDelay)

    : DelayQueueEntry(timeToDelay), fProc(proc), fClientData(clientData) {

  }

private: // redefined virtual functions

  virtual void handleTimeout() {

    (*fProc)(fClientData);

    DelayQueueEntry::handleTimeout();

  }

private:

  TaskFunc* fProc;

  void* fClientData;

};

posted on 2013-09-10 04:14 楊粼波 閱讀(1439) 評論(0)  編輯 收藏 引用

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            免费美女久久99| 国产精品视频导航| 久久成年人视频| 亚洲女同在线| 欧美在线看片a免费观看| 欧美一区二区视频免费观看| 久久久国际精品| 欧美mv日韩mv国产网站app| 久久永久免费| 亚洲全部视频| 亚洲一区二区动漫| 久久久久亚洲综合| 免费亚洲一区二区| 国产精品免费网站| 亚洲国产欧美精品| 亚洲嫩草精品久久| 久久婷婷国产综合尤物精品| 91久久精品美女高潮| 亚洲一区二区在线播放| 麻豆免费精品视频| 国产精品丝袜xxxxxxx| 在线免费高清一区二区三区| 一区二区久久| 卡通动漫国产精品| 亚洲线精品一区二区三区八戒| 欧美一区二区在线播放| 欧美精品一区在线观看| 精东粉嫩av免费一区二区三区| 99视频热这里只有精品免费| 久久九九免费视频| 一区二区不卡在线视频 午夜欧美不卡在 | 亚洲午夜精品视频| 麻豆av一区二区三区久久| 久久一区免费| 亚洲美女视频网| 欧美在线高清| 国产精品人人做人人爽| 99国产精品视频免费观看一公开| 久久国产视频网站| 一区二区三区国产精华| 欧美成人免费全部| 狠狠色综合网| 久久精品首页| 午夜国产精品视频免费体验区| 欧美人成免费网站| 亚洲精品乱码久久久久久日本蜜臀| 欧美一区午夜精品| 亚洲影视中文字幕| 国产精品免费区二区三区观看| 99re热这里只有精品免费视频| 国产精品久久久久天堂| 亚洲日本成人网| 亚洲欧美在线观看| 一本一本久久a久久精品综合妖精| 欧美**人妖| 亚洲精品色婷婷福利天堂| 欧美华人在线视频| 麻豆av一区二区三区| 亚洲激情欧美激情| 亚洲国产欧美一区| 欧美久久久久久| 亚洲色图自拍| 亚洲影视在线| 国产综合一区二区| 欧美不卡高清| 欧美激情免费观看| 亚洲天堂男人| 亚洲影院色在线观看免费| 国产女同一区二区| 久久久青草婷婷精品综合日韩| 久久国产加勒比精品无码| 伊人久久噜噜噜躁狠狠躁 | 最新热久久免费视频| 欧美精品福利| 亚洲一区制服诱惑| 欧美亚洲视频在线观看| 极品尤物av久久免费看| 欧美韩国一区| 欧美日韩综合网| 久久国产精品久久国产精品| 久久精彩视频| 99pao成人国产永久免费视频| 亚洲美女中出| 亚洲网站在线看| 国产精品美女久久久免费| 久久精品一区二区国产| 美女主播视频一区| 亚洲影院色无极综合| 欧美中文字幕| 99视频一区| 欧美专区日韩视频| 一区二区三区久久网| 欧美中文字幕精品| 亚洲天堂久久| 开心色5月久久精品| 亚洲香蕉在线观看| 久久蜜臀精品av| 亚洲一本视频| 噜噜噜91成人网| 欧美在线观看视频一区二区| 免费成人av在线| 欧美伊人影院| 欧美母乳在线| 欧美不卡福利| 韩国在线一区| 亚洲视频免费在线| 最近中文字幕mv在线一区二区三区四区| 99国产一区| 亚洲国产精品ⅴa在线观看| 亚洲伊人第一页| 99re6热在线精品视频播放速度 | 亚洲人成精品久久久久| 欧美一级日韩一级| 久久久欧美精品sm网站| 亚洲综合色丁香婷婷六月图片| 久久香蕉国产线看观看av| 亚洲欧美日韩综合aⅴ视频| 欧美国产精品中文字幕| 免费成人高清在线视频| 国产精品―色哟哟| 在线一区亚洲| 中国av一区| 欧美日本亚洲韩国国产| 亚洲国产精品久久久久婷婷884 | 欧美成人影音| 欧美成年人在线观看| 国产一本一道久久香蕉| 亚洲一区二区三区四区在线观看 | 久久久激情视频| 国产日本欧洲亚洲| 亚洲午夜一区二区| 亚洲女性裸体视频| 国产精品电影网站| 亚洲第一精品久久忘忧草社区| 校园春色综合网| 久久精品女人天堂| 国产午夜精品久久| 久久超碰97人人做人人爱| 欧美一区日韩一区| 国产日韩精品在线| 久久成人免费电影| 免费观看一区| 亚洲黄色在线观看| 欧美精品少妇一区二区三区| 亚洲精品系列| 亚洲欧美高清| 国产日韩精品视频一区| 欧美一区二区三区婷婷月色| 久久精品视频亚洲| 亚洲国内精品在线| 欧美日韩亚洲一区二| 亚洲在线成人精品| 久久久国产精品亚洲一区 | 欧美高清视频一区二区三区在线观看| 亚洲高清在线播放| 欧美精品一区二区三区蜜臀 | 女仆av观看一区| 亚洲精品午夜| 久久成人一区二区| 亚洲国产精品va在线观看黑人 | 影音先锋中文字幕一区| 欧美国产成人精品| 亚洲性图久久| 美女黄网久久| 亚洲午夜在线观看视频在线| 国产欧美在线| 欧美精品www在线观看| 亚洲男女毛片无遮挡| 欧美freesex交免费视频| 在线午夜精品自拍| 久久国产精彩视频| 久久国产精品久久久久久| 在线成人性视频| 欧美视频在线观看一区| 久久九九免费视频| 一区二区三区不卡视频在线观看 | 亚洲欧美激情四射在线日 | aa成人免费视频| 国产日韩欧美三区| 欧美人成免费网站| 久久久精品免费视频| 宅男噜噜噜66一区二区| 欧美激情视频一区二区三区在线播放| 午夜精品久久久久99热蜜桃导演| 亚洲国产日韩一级| 国产欧美一区视频| 欧美小视频在线| 欧美韩日一区| 老司机午夜精品视频| 校园激情久久| 亚洲天堂久久| 亚洲每日在线| 欧美激情bt| 免费在线国产精品| 久久久国产精品一区二区三区| 亚洲一级黄色av| 一区二区三区四区五区在线 | 国产裸体写真av一区二区| 欧美精品福利| 欧美成人精品在线观看|