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

牽著老婆滿街逛

嚴以律己,寬以待人. 三思而后行.
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 楊粼波 閱讀(1442) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            99riav久久精品riav| 国产精品免费网站在线观看| 亚洲网站在线看| 久久九九免费| 午夜视频一区| 欧美日韩不卡一区| 麻豆精品视频在线观看| 国产精品美女xx| 亚洲精选视频免费看| 黄色成人av网站| 午夜免费久久久久| 亚洲欧美日韩直播| 欧美日韩大片| 亚洲韩国日本中文字幕| 激情欧美亚洲| 欧美一区二区三区在| 亚洲影视在线| 欧美日韩亚洲一区二区三区在线观看| 欧美成人日本| 亚洲电影免费观看高清完整版在线| 亚洲欧美国产视频| 午夜视频久久久| 国产精品久久久久免费a∨| 亚洲免费观看视频| 亚洲另类视频| 欧美激情综合网| 91久久精品一区二区三区| 亚洲第一伊人| 久久亚洲一区二区| 欧美成人午夜| 亚洲人成在线观看网站高清| 免费成人高清视频| 亚洲电影欧美电影有声小说| 亚洲国产mv| 欧美成人精品一区二区| 欧美激情性爽国产精品17p| 亚洲国产精品久久久久秋霞不卡| 久久影视三级福利片| 欧美成人中文字幕在线| 亚洲国产日韩欧美在线99| 免费不卡在线观看av| 亚洲激情中文1区| 国产精品99久久久久久www| 欧美三级电影精品| 亚洲一区二区视频在线| 久久精品国产欧美亚洲人人爽| 国产亚洲一区二区三区| 久久先锋影音av| 91久久精品国产91久久| 亚洲视频第一页| 国产精品一区二区a| 久久国产婷婷国产香蕉| 欧美成人精品在线观看| 日韩午夜在线| 国产精品日韩| 久久精品国产久精国产思思| 欧美成人午夜激情视频| 亚洲午夜久久久| 国产日韩欧美精品在线| 免费不卡在线观看av| 一本高清dvd不卡在线观看| 久久九九全国免费精品观看| 亚洲第一狼人社区| 欧美色大人视频| 久久riav二区三区| 亚洲国产成人精品女人久久久| 亚洲特级毛片| 激情综合网址| 欧美日韩一区在线| 久久高清一区| 一区二区久久| 欧美成人精品影院| 亚洲欧美在线观看| 有码中文亚洲精品| 国产精品都在这里| 久久亚洲春色中文字幕| 一区二区三区欧美在线观看| 能在线观看的日韩av| 亚洲中字在线| 最新国产拍偷乱拍精品| 国产美女诱惑一区二区| 欧美成人xxx| 久久精品91| 在线视频一区二区| 欧美激情久久久久| 久久精品国产免费观看| 这里只有精品在线播放| 伊人激情综合| 国产欧美短视频| 欧美日韩精品欧美日韩精品| 久久综合给合久久狠狠狠97色69| 日韩视频精品在线观看| 欧美激情国产日韩| 欧美综合国产| 亚洲一区日本| 中国av一区| 亚洲免费观看| 亚洲黄色精品| 在线观看日韩av电影| 国产日韩视频一区二区三区| 欧美色欧美亚洲另类七区| 免费观看在线综合色| 久久国产日本精品| 性欧美8khd高清极品| 亚洲一级电影| 亚洲调教视频在线观看| 亚洲精品视频一区二区三区| 欧美成人中文字幕| 欧美不卡在线视频| 久久综合精品国产一区二区三区| 午夜免费久久久久| 亚洲欧美日韩久久精品| 亚洲女女做受ⅹxx高潮| 亚洲一区视频在线观看视频| 99天天综合性| 中日韩美女免费视频网址在线观看| 亚洲精品一区在线| 亚洲国内精品| 亚洲精品一品区二品区三品区| 亚洲国产你懂的| 最新亚洲视频| 日韩一级片网址| 99re热这里只有精品免费视频| 日韩视频永久免费观看| 亚洲精品一区在线观看香蕉| 99亚洲视频| 亚洲一区尤物| 欧美在现视频| 久久综合国产精品台湾中文娱乐网| 久久欧美中文字幕| 免费不卡在线观看| 亚洲第一区在线| 亚洲日本欧美天堂| 99精品国产在热久久下载| 一区二区三区欧美亚洲| 亚洲综合成人婷婷小说| 久久精品二区三区| 欧美成人亚洲成人日韩成人| 欧美日产一区二区三区在线观看| 欧美日本一道本| 国产精品人人做人人爽人人添| 国产亚洲福利一区| 欲色影视综合吧| 一区二区欧美国产| 欧美一区二区视频观看视频| 久久综合亚州| 亚洲巨乳在线| 亚洲资源av| 老司机亚洲精品| 欧美日韩综合在线| 国产一区二区三区高清在线观看| 亚洲国产精品v| 在线视频精品一| 久久成人亚洲| 亚洲国产欧美一区| 亚洲夜晚福利在线观看| 久久久久久久一区二区三区| 欧美精品大片| 国产亚洲一区二区三区在线观看| 亚洲成色999久久网站| 宅男噜噜噜66一区二区66| 久久精品一本| 日韩亚洲精品视频| 久久久国产午夜精品| 欧美精品一区二区三区蜜桃| 国产亚洲激情| 亚洲午夜在线观看| 麻豆av福利av久久av| 在线视频精品一区| 毛片基地黄久久久久久天堂| 国产精品色网| 日韩午夜精品| 久久综合色88| 亚洲永久精品大片| 欧美高潮视频| 国产在线成人| 亚洲影视九九影院在线观看| 亚洲第一精品福利| 久久激情网站| 国产伦精品一区二区三区| 日韩亚洲不卡在线| 久久综合久久久久88| 亚洲夜间福利| 欧美视频日韩视频在线观看| 亚洲激情第一区| 久久三级视频| 亚洲欧美在线高清| 欧美日韩一二三四五区| 亚洲精品美女| 蜜桃久久精品乱码一区二区| 亚洲欧美国产va在线影院| 欧美天堂亚洲电影院在线播放| 亚洲国产综合91精品麻豆| 久久国产精品一区二区三区| 一区二区三区三区在线| 欧美日韩三级电影在线| 一区二区三区黄色| 欧美激情视频网站| 久久野战av| 伊人精品在线|