文档章节

9 DelayQueueEntry 延时队列节点类——Live555源码阅读(一)基本组件类

乌合之众
 乌合之众
发布于 2015/06/07 22:10
字数 822
阅读 23
收藏 0

#9 DelayQueueEntry 延时队列节点类——Live555源码阅读(一)基本组件类

这是Live555源码阅读的第一部分,包括了时间类,延时队列类,处理程序描述类,哈希表类这四个大类。

本文由乌合之众 lym瞎编,欢迎转载 my.oschina.net/oloroso

##DelayQueueEntry 延时队列节点类 entry的意思如下

entry n.进入,入场; 入口处,门口; 登记,记录; 参加比赛的人;

为什么说是节点类呢?这个通过阅读代码就可以知道了。 DelayQueueEntry类含有四个数据成员,其中fNextfPrev说明了其是一个链表的节点。fToken是节点的标识,DelayInterval fDeltaTimeRemaining成员是一个代表时间间隔的量,在后面任务调度器调度任务的时候会使用到。

9_DelayQueueEntry

还有一个静态的成员static intptr_t tokenCounter用来作为token标识的不重复的初始化;注意,静态成员不是对象的成员,而是类的成员。(所有的对象共享这一个) 这里可以看到,其构造函数是protected权限的,而析构函数是public权限的。且没有了别的构造相关方法,也就是说这个类对象只能由其派生类来创建,但是销毁是对外开放的。其派生类有两个AlarmHandlerDelayQueue

///// DelayQueueEntry /////
// 延时队列记录(节点)   entry n.进入,入场; 入口处,门口; 登记,记录; 参加比赛的人;
class DelayQueueEntry {
public:
  virtual ~DelayQueueEntry();
  intptr_t token() {
    return fToken;
  }
protected: // abstract base class
  DelayQueueEntry(DelayInterval delay);
  // delete this;
  virtual void handleTimeout();
private:
  friend class DelayQueue;
  DelayQueueEntry* fNext;	//下一个节点
  DelayQueueEntry* fPrev;	//上一个节点
  DelayInterval fDeltaTimeRemaining;	//延时剩余的时间

  intptr_t fToken;	//标识,等指针宽度的int型
  static intptr_t tokenCounter;	//标识计数(注意此处是static 变量)
};

##DelayQueueEntry的构造

DelayQueueEntry的构造是很简单的,其只有一个参数,就是延时间隔时间。这里的构造与前面说的HandlerDescriptor略有不同,因为它没有把自身加入到链表中,而是把fNext和fPrev都指向this

这里要说的就是fToken的初始化赋值,是根据静态成员tockenCounter自增来的。这里便保证了在一个指针表示的范围内,fToken是不会重复的。这里说一下为什么fToken的类型是intptr_tintptr_t是一个等指针宽度的int型。我们知道指针是用来寻址的,指针的宽度代表了最大的寻址空间。32位的指针能够寻址的范围是4G大小。这里DelayQueueEntry对象的大小显然不是1Byte,就是把内存占满的情况下,fToken也不会重复。(不可能让它占满)

DelayQueueEntry::DelayQueueEntry(DelayInterval delay)
  : fDeltaTimeRemaining(delay) {
  fNext = fPrev = this;
  fToken = ++tokenCounter;
}

##handleTimeout方法

这个方法异常简单,就是销毁自身。这里要说的是它的方法名,意思很简单,处理超时。顺便说一下,DelayQueueEntry的析构是空函数,什么也没有做。

void DelayQueueEntry::handleTimeout() {
  delete this;
}

© 著作权归作者所有

乌合之众
粉丝 14
博文 90
码字总数 79438
作品 1
海淀
程序员
私信 提问
taobao-pamirs-schedule-2.0源码分析——类设计

使用方法 首先学习一个开源项目,一定要先学习该开源项目的使用方法。该项目的使用方法本文不再详述。请参考博文: http://pinsir.iteye.com/blog/882275 http://pinsir.iteye.com/blog/882...

杨武兵
2016/03/02
1K
8
[译] 深入 React Hook 系统的原理

原文地址:Under the hood of React’s hooks system 原文作者:Eytan Manor 译文出自:掘金翻译计划 本文永久链接:github.com/xitu/gold-m… 译者:EmilyQiRabbit 校对者:sunui,hanxian...

玉儿Qi
03/26
0
0
让android支持RTSP及live555分析

#DATE 2012/05/09 #2012/08/27由cnblogs迁入 如何让Android支持C++异常机制 Android不支持C++异常机制,如果需要用到的话,则需要在编译的时候加入比较完整的C++库. Android支持的C++库可以在A...

Wii-D
2012/08/27
5.6K
6
并发编程(十四)—— ScheduledThreadPoolExecutor 实现原理与源码深度解析 之DelayWorkQueue

目录 什么是堆? 满二叉树 完全二叉树 堆的实现 最大堆的插入(ADD) 最大堆的删除(DELETE) DelayedWorkQueue类 属性 插入元素方法 等待获取队列头元素 超时等待获取队列头元素 推荐博客 ...

亭子happy
03/27
15
0
Element-UI阅读理解(4) - 弹窗管理工具类PopupManager

前言 不推荐通篇阅读,建议将element-ui源码下载并运行到本地,按照自己的方式阅读源码,遇上不明白点可以来这里Ctrl+F搜索一下,看这里有没有记录。 这算不上是分享,只是自己对源码阅读理解...

Canzone
09/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Java FOR-EACH循环

FOR-EACH循环使得代码更加的简短,也让代码更加易懂,其实他并没有加入什么新的功能。他的功能完全可以用简单的FOR循环代替。 for-each的用法: int a[] = {1,2,3,4,5,6} for(int s:a){ Syst...

无名氏的程序员
13分钟前
2
0
使用HTML5的History API

本文转载于:专业的前端网站➣使用HTML5的History API   HTML5 History API提供了一种功能,能让开发人员在不刷新整个页面的情况下修改站点的URL。这个功能很有用,例如通过一段JavaScript代...

前端老手
16分钟前
2
0
JAVA 编写redisUtils工具类,防止高并发获取缓存出现并发问题

import lombok.extern.slf4j.Slf4j;import org.springframework.data.redis.core.BoundHashOperations;import org.springframework.data.redis.core.BoundValueOperations;import org.......

huangkejie
57分钟前
7
0
JMM内存模型(一)&volatile关键字的可见性

在说这个之前,我想先说一下计算机的内存模型: CPU在执行的时候,肯定要有数据,而数据在内存中放着呢,这里的内存就是计算机的物理内存,刚开始还好,但是随着技术的发展,CPU处理的速度越...

走向人生巅峰的大路
今天
98
0
你对AJAX认知有多少(2)?

接着昨日内容,我们几天继续探讨ajax的相关知识点 提到ajax下面几个问题又是必须要了解的啦~~~ 8、在浏览器端如何得到服务器端响应的XML数据。 通过XMLHttpRequest对象的responseXMl属性 9、 ...

理性思考
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部