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

牽著老婆滿街逛

嚴以律己,寬以待人. 三思而后行.
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>
            欧美一级黄色录像| 亚洲免费视频网站| 欧美大尺度在线| 日韩视频一区二区三区在线播放免费观看 | 亚洲一区在线免费| 国产精品免费福利| 性伦欧美刺激片在线观看| 久久亚洲国产精品一区二区| 在线电影国产精品| 欧美sm重口味系列视频在线观看| 最近中文字幕日韩精品| 亚洲小少妇裸体bbw| 国产精品一区二区三区乱码 | 久久精品国产v日韩v亚洲| 免费国产一区二区| aa成人免费视频| 国产九区一区在线| 久久久久久网| 亚洲啪啪91| 欧美在线免费视频| 亚洲成色777777女色窝| 欧美日韩日本视频| 欧美亚洲综合网| 亚洲精品乱码久久久久久| 亚洲影院免费观看| 亚洲国产欧美一区二区三区久久| 亚洲亚洲精品在线观看 | 在线观看日韩| 欧美三级中文字幕在线观看| 欧美一级免费视频| 亚洲欧洲久久| 麻豆成人在线播放| 亚洲欧美日韩成人| 亚洲激情一区| 国产综合第一页| 欧美日韩一区在线观看| 久久精品在线视频| 中文日韩电影网站| 亚洲第一精品夜夜躁人人爽| 久久福利电影| 亚洲综合首页| 亚洲蜜桃精久久久久久久| 国产综合网站| 国产伦精品一区二区三区视频黑人 | 久久久九九九九| 亚洲午夜精品| 亚洲美女黄网| 欧美激情亚洲自拍| 久久久久国产一区二区三区| 亚洲欧美成人在线| 亚洲国产精品成人综合| 国产午夜亚洲精品不卡| 国产精品mv在线观看| 欧美高清不卡| 欧美a级片网站| 老妇喷水一区二区三区| 久久精品欧美日韩精品| 午夜宅男久久久| 亚洲女女做受ⅹxx高潮| 一区二区三区四区五区在线| 亚洲激情第一区| 亚洲福利视频网| 欧美激情亚洲综合一区| 免费观看国产成人| 久久亚洲综合色| 久久亚洲综合网| 久久亚洲图片| 美国成人毛片| 欧美成人视屏| 欧美成人精品高清在线播放| 久久躁狠狠躁夜夜爽| 久久综合成人精品亚洲另类欧美| 久久久青草青青国产亚洲免观| 久久九九电影| 美女爽到呻吟久久久久| 免费永久网站黄欧美| 麻豆亚洲精品| 欧美高清在线精品一区| 亚洲高清毛片| 日韩小视频在线观看| 一区二区三区欧美激情| 中文国产一区| 午夜日本精品| 玖玖综合伊人| 欧美激情综合五月色丁香| 欧美日韩国产黄| 国产精品久久久久久亚洲毛片| 国产精品亚洲综合天堂夜夜 | 亚洲一区在线观看免费观看电影高清| 一区二区三区毛片| 亚洲免费伊人电影在线观看av| 午夜视频在线观看一区二区| 久久九九热免费视频| 蜜桃久久av一区| 亚洲精品欧美精品| 亚洲午夜电影在线观看| 欧美一级免费视频| 麻豆久久婷婷| 欧美日韩亚洲精品内裤| 国产精品欧美日韩| 伊人久久亚洲热| 亚洲看片网站| 欧美一区二视频在线免费观看| 久久久久这里只有精品| 亚洲大片av| 亚洲欧美另类在线观看| 久久午夜电影| 国产精品久久久久影院亚瑟 | 久久国产精品亚洲77777| 久久久久免费观看| 亚洲黄网站黄| 欧美亚洲视频| 欧美激情综合亚洲一二区| 国产精品无码永久免费888| 亚洲国产成人在线播放| 亚洲男女毛片无遮挡| 免费亚洲一区二区| 一区二区av在线| 久久婷婷国产麻豆91天堂| 欧美性一区二区| 亚洲国产日本| 欧美一区二粉嫩精品国产一线天| 女女同性女同一区二区三区91| 日韩视频在线免费| 欧美在线在线| 国产精品高潮呻吟久久av黑人| 亚洲大胆女人| 久久精品国产99国产精品澳门| 欧美国产日本在线| 亚洲专区欧美专区| 欧美另类视频在线| 伊人成人网在线看| 亚洲欧美日韩成人高清在线一区| 欧美激情一区三区| 羞羞漫画18久久大片| 欧美日韩裸体免费视频| 亚洲电影成人| 老司机一区二区| 午夜精品久久久久影视| 欧美日韩免费观看中文| 亚洲国产专区| 免费不卡在线观看av| 亚洲综合色婷婷| 欧美性一区二区| 一道本一区二区| 亚洲高清123| 久久夜色精品国产| 国内精品视频一区| 欧美制服丝袜| 午夜久久资源| 国产亚洲一区二区三区| 午夜在线精品| 亚洲免费小视频| 国产精品乱看| 亚洲在线一区二区三区| 99精品视频免费观看| 欧美精品18+| 日韩亚洲成人av在线| 欧美激情 亚洲a∨综合| 久久亚洲免费| 亚洲国产精品女人久久久| 美女脱光内衣内裤视频久久影院| 久久国产精品亚洲va麻豆| 国产视频久久久久| 久久精品二区三区| 欧美在线免费观看视频| 国语精品一区| 欧美成ee人免费视频| 欧美v日韩v国产v| 99国产精品99久久久久久粉嫩| 亚洲激情成人| 欧美特黄a级高清免费大片a级| 亚洲愉拍自拍另类高清精品| 亚洲一区二区在线播放| 国产嫩草影院久久久久| 久久精品国产一区二区三区| 欧美自拍偷拍| 亚洲高清色综合| 亚洲人体1000| 国产精品乱看| 久久久噜噜噜久久| 麻豆91精品91久久久的内涵| 日韩午夜免费| 亚洲一区一卡| 在线成人免费观看| 亚洲国产精品一区二区久| 欧美日韩国产首页在线观看| 亚洲综合日韩| 久久久亚洲精品一区二区三区 | 久久综合久久综合久久综合| 久久在线免费观看| 99亚洲一区二区| 亚洲免费一区二区| 亚洲黄网站在线观看| 亚洲久久在线| 国户精品久久久久久久久久久不卡 | 欧美专区在线| av成人黄色| 欧美有码视频| 亚洲理论在线|