21 BasicTaskScheduler基本任务调度器(一)——Live555源码阅读(一)任务调度相关类
这是Live555源码阅读的第二部分,包括了任务调度相关的三个类。任务调度是Live555源码中很重要的部分。
本文由乌合之众 lym瞎编,欢迎转载
http://www.cnblogs.com/oloroso/
本文由乌合之众 lym瞎编,欢迎转载my.oschina.net/oloroso
BasicTaskScheduler基本任务调度器
BasicTaskScheduler很重要了,有了前面的铺垫,这个不会很难。
这个类的重点在于BasicTaskScheduler::SingleStep方法的实现。弄懂了这个,基于事件处理模型也就差不多弄懂了。
这里添加了四个数据成员,是用来select模型的。关于select模型,这里不解释了。在windows和unix/linux等平台都有相关的API,实现有点差别,但是原理是一致的。
int fMaxNumSockets; //最大的socket数,select调用时提高效率
fd_set fReadSet; //监控读操作的集合
fd_set fWriteSet; //监控写操作的集合
fd_set fExceptionSet; //监控有异常的集合


BasicTaskScheduler基本任务调度器的定义
class BasicTaskScheduler : public BasicTaskScheduler0 {
public:
static BasicTaskScheduler* createNew();
virtual ~BasicTaskScheduler();
protected:
BasicTaskScheduler();
// called only by "createNew()"
protected:
// Redefined virtual functions:
/*
* 设置select的超时时间为maxDelayTime(<=0 或大于一百万秒 时1百万秒)
* 调用int selectResult = select(fMaxNumSockets, &readSet, &writeSet, &exceptionSet, &tv_timeToDelay);
* 如果select出错返回,打印出错信息,并调用 internalError函数
* 从处理程序描述链表中查找fLastHandledSocketNum代表的 处理程序描述对象指针,如果没找到,就在后面的while的时候从链表的头开始,否则从找到的位置开始
* 从链表中取出处理程序描述节点对象,并调用其内部保存的处理程序
* 设置fTriggersAwaitingHandling
* 调用fDelayQueue.handleAlarm();
*/
virtual void SingleStep(unsigned maxDelayTime);
// 添加到后台处理
virtual void setBackgroundHandling(int socketNum, int conditionSet, BackgroundHandlerProc* handlerProc, void* clientData);
// 从后台处理移出
virtual void moveSocketHandling(int oldSocketNum, int newSocketNum);
protected:
// To implement background operations: 实施后台操作
int fMaxNumSockets; //最大的socket数,select调用时提高效率
fd_set fReadSet; //监控读操作的集合
fd_set fWriteSet; //监控写操作的集合
fd_set fExceptionSet; //监控有异常的集合
};
BasicTaskScheduler的构造与析构
BasicTaskScheduler的构造函数是protected权限的,其只在静态方法createNew中被调用。
创建的时候清零了四个成员,并调用了schedulerTickTask(this)。
BasicTaskScheduler::BasicTaskScheduler()
: fMaxNumSockets() {
FD_ZERO(&fReadSet);
FD_ZERO(&fWriteSet);
FD_ZERO(&fExceptionSet); schedulerTickTask(this); // ensures that we handle events frequently
}
下面来介绍一下schedulerTickTask函数(调度滴答任务)
这个函数的作用就是将其参数转为(BasicTaskScheduler*)类型,然后调用scheduleDelayedTask来调度(创建)一个延时任务。有意思的是,这个延时任务程序就是这个函数自身,延时任务程序的参数也是其参数。延时时间是10毫秒。
这有点像是函数递归调用了。与之不同的是,如果不去调度任务,递归就是无效的。
#define MAX_SCHEDULER_GRANULARITY 10000 // 10 microseconds: We will return to the event loop at least this often
static void schedulerTickTask(void* clientData) {
((BasicTaskScheduler*)clientData)->scheduleDelayedTask(MAX_SCHEDULER_GRANULARITY, schedulerTickTask, clientData);
}
析构函数是空的,就不说了。只要知道,在析构的时候会调用基类的析构函数。
21 BasicTaskScheduler基本任务调度器(一)——Live555源码阅读(一)任务调度相关类的更多相关文章
- 12 哈希表相关类——Live555源码阅读(一)基本组件类
12 哈希表相关类--Live555源码阅读(一)基本组件类 这是Live555源码阅读的第一部分,包括了时间类,延时队列类,处理程序描述类,哈希表类这四个大类. 本文由乌合之众 lym瞎编,欢迎转载 ...
- 18 TaskScheduler任务调度器抽象基类——Live555源码阅读(一)任务调度相关类
这是Live555源码阅读的第二部分,包括了任务调度相关的三个类.任务调度是Live555源码中很重要的部分. 本文由乌合之众 lym瞎编,欢迎转载 http://www.cnblogs.com/ol ...
- 17 任务调度相关类综述——Live555源码阅读(一)任务调度相关类
这是Live555源码阅读的第二部分,包括了任务调度相关的三个类.任务调度是Live555源码中很重要的部分. 本文由乌合之众 lym瞎编,欢迎转载 http://www.cnblogs.com/ol ...
- 20 BasicTaskScheduler0 基本任务调度类基类(二)——Live555源码阅读(一)任务调度相关类
这是Live555源码阅读的第二部分,包括了任务调度相关的三个类.任务调度是Live555源码中很重要的部分. 本文由乌合之众 lym瞎编,欢迎转载 http://www.cnblogs.com/ol ...
- 19 BasicTaskScheduler0 基本任务调度类基类(一)——Live555源码阅读(一)任务调度相关类
这是Live555源码阅读的第二部分,包括了任务调度相关的三个类.任务调度是Live555源码中很重要的部分. 本文由乌合之众 lym瞎编,欢迎转载 http://www.cnblogs.com/ol ...
- 9 DelayQueueEntry 延时队列节点类——Live555源码阅读(一)基本组件类
这是Live555源码阅读的第一部分,包括了时间类,延时队列类,处理程序描述类,哈希表类这四个大类. 本文由乌合之众 lym瞎编,欢迎转载 http://www.cnblogs.com/oloroso ...
- 8 延时队列相关类——Live555源码阅读(一)基本组件类
这是Live555源码阅读的第一部分,包括了时间类,延时队列类,处理程序描述类,哈希表类这四个大类. 本文由乌合之众 lym瞎编,欢迎转载 http://www.cnblogs.com/oloroso ...
- 7 HandlerSet 处理程序链表类——Live555源码阅读(一)基本组件类
这是Live555源码阅读的第一部分,包括了时间类,延时队列类,处理程序描述类,哈希表类这四个大类. 本文由乌合之众 lym瞎编,欢迎转载 my.oschina.net/oloroso Handler ...
- 16 BasicHashTable基本哈希表类(三)——Live555源码阅读(一)基本组件类
这是Live555源码阅读的第一部分,包括了时间类,延时队列类,处理程序描述类,哈希表类这四个大类. 本文由乌合之众 lym瞎编,欢迎转载 http://www.cnblogs.com/oloroso ...
随机推荐
- BigInteger类
当一个数字非常大时,则肯定无法使用基本类型接受,所以使用了BigInteger类. BigInteger类表示是大整数类,定义在java.math包中,如果在操作时一个整型数据已经超过了整数的最大类型 ...
- Java自定义异常类
用户可以根据自己的需要定义自己的异常类,定义异常类只需要继承Exception类即可 //================================================= // Fi ...
- 如何写好一篇高质量的paper
http://blog.csdn.net/tiandijun/article/details/41775223 这篇文章来源于中科院Zhouchen Lin 教授的report,有幸读到,和大家分享一 ...
- python类相关
class A: def bar(self): print("BAR") self.f1() class B(A): def f1(self): print("B&quo ...
- PetaPoco dynamic
PetaPoco最初的灵感来自Massive-通过dynamic Expando objects返回一切.对于大多数情况我觉得这比较麻烦,更喜欢强类型的类.但是有些时候支持dynamic也是有用的-特 ...
- DELL服务器引导光盘下载
http://www.dell.com/support/home/cn/zh/cndhs1/Drivers/DriversDetails?driverId=68RWT&fileid=27311 ...
- 使用pt-fifo-split 工具往mysql插入海量数据
在<mysql插入/更新数据>这篇文章提到,使用LOAD DATA INFILE语句,可以从一个文件直接加载数据到mysql中,但如果文件非常大,可能还需要对文件进行切割,分多次加载,这种 ...
- Centos安装Kafka集群
kafka是LinkedIn开发并开源的一个分布式MQ系统,现在是Apache的一个孵化项目.在它的主页描述kafka为一个高吞吐量的分布式(能 将消息分散到不同的节点上)MQ.在这片博文中,作者简单 ...
- Linux命令lsb_release:查看当前系统的发行版信息
Linux里的lsb_release命令用来查看当前系统的发行版信 息(prints certain LSB (Linux Standard Base) and Distribution inform ...
- 记录在xx公司被考核的15天及自己的感想
在大学有两件事让我很遗憾. 第一:在2013年7月我和自己的前任女朋友分手,这是两年前的事了,我们谈了七个月. 第二:在2015年4月我被xx公司淘汰了,正如我的前任女朋友是我遇到的最好女孩,这家公司 ...