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 ...
随机推荐
- Java数据库——ResultSet接口
使用SQL中的SELECT语句可以查询出数据库的全部结果,在JDBC的操作中数据库的所有查询记录将使用ResultSet进行接收,并使用ResultSet显示内容. 从user表中查询数据 //=== ...
- NopCommerce源码分析ContainerBuilder builder.Update(container)
/// <summary> /// Register dependencies /// </summary> /// <param name="config&q ...
- Hibernate与Mybatis的概念区别
首先简单介绍下两者的概念: Hibernate :Hibernate 是当前最流行的ORM框架,对数据库结构提供了较为完整的封装. Mybatis:Mybatis同样也是非常流行的ORM框架,主要着力 ...
- java.lang.ClassNotFoundException与java.lang.NoClassDefFoundError的区别
java.lang.ClassNotFoundException与java.lang.NoClassDefFoundError的区别 以前一直没有注意过这个问题,前两天机缘巧合上网查了一下,然后自 ...
- Python-面向对象编程(二)
面向对象进阶篇: 初级篇中我们介绍了面向对象基本知识: 1.面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 2.介绍了类中的对象.方法和属性及类中内置的方法 3.类 是一个模板 ...
- BootStrap学习------栅格
使用Bootstrap前端框架-栅格 要点 1.使用Bootstrap需要引入的css和js: (1)bootstrap.min.js (2)bootstrap.min.css 2.栅格系统需要通过& ...
- data and dream
1 用通俗的语言介绍下线性回归->逻辑回归->SVM之间的区别和联系. 2 聚类算法的应用场景,以及k-means中的k值怎么确定. def center(data): center = ...
- c++模板
1.从 python 说起 def add(a, b): return a + b; print add(3.1, 5.1); #8.2 print add("abc", &quo ...
- 移动端网站优化指南-WAP篇
转载:http://seofangfa.com/mobile-seo/mobile-seo-guide.html 1.域名优化:启用短域名,例如:m.abc.com,便于用户记忆,方便搜索蜘蛛查找,减 ...
- ASO优化总结(基于网络分享的知识总结归纳)
如何优化应用标题? 注意关键字的长度,尽量保证每一个关键字小于10个字符.保持快速更新,因为每次更新,你都将有机会删除表现不佳的关键字以 及增添新的关键字.在ASO中使用关键字的正确做法 标题,并非越 ...