21 BasicTaskScheduler基本任务调度器(一)——Live555源码阅读(一)任务调度相关类
2015-06-25 15:00
357 查看
http://www.cnblogs.com/oloroso/
my.oschina.net/oloroso
BasicTaskScheduler基本任务调度器
BasicTaskScheduler很重要了,有了前面的铺垫,这个不会很难。这个类的重点在于
BasicTaskScheduler::SingleStep方法的实现。弄懂了这个,基于事件处理模型也就差不多弄懂了。这里添加了四个数据成员,是用来
select模型的。关于select模型,这里不解释了。在windows和unix/linux等平台都有相关的API,实现有点差别,但是原理是一致的。
intfMaxNumSockets;//最大的socket数,select调用时提高效率fd_setfReadSet;//监控读操作的集合fd_setfWriteSet;//监控写操作的集合fd_setfExceptionSet;//监控有异常的集合
BasicTaskScheduler基本任务调度器的定义
classBasicTaskScheduler:publicBasicTaskScheduler0{public:staticBasicTaskScheduler*createNew();virtual~BasicTaskScheduler();protected:BasicTaskScheduler();//calledonlyby"createNew()"protected://Redefinedvirtualfunctions:/**设置select的超时时间为maxDelayTime(<=0或大于一百万秒时1百万秒)*调用intselectResult=select(fMaxNumSockets,&readSet,&writeSet,&exceptionSet,&tv_timeToDelay);*如果select出错返回,打印出错信息,并调用internalError函数*从处理程序描述链表中查找fLastHandledSocketNum代表的处理程序描述对象指针,如果没找到,就在后面的while的时候从链表的头开始,否则从找到的位置开始*从链表中取出处理程序描述节点对象,并调用其内部保存的处理程序*设置fTriggersAwaitingHandling*调用fDelayQueue.handleAlarm();*/virtualvoidSingleStep(unsignedmaxDelayTime);//添加到后台处理virtualvoidsetBackgroundHandling(intsocketNum,intconditionSet,BackgroundHandlerProc*handlerProc,void*clientData);//从后台处理移出virtualvoidmoveSocketHandling(intoldSocketNum,intnewSocketNum);protected://Toimplementbackgroundoperations:实施后台操作intfMaxNumSockets;//最大的socket数,select调用时提高效率fd_setfReadSet;//监控读操作的集合fd_setfWriteSet;//监控写操作的集合fd_setfExceptionSet;//监控有异常的集合};
BasicTaskScheduler的构造与析构
BasicTaskScheduler的构造函数是protected权限的,其只在静态方法createNew中被调用。创建的时候清零了四个成员,并调用了schedulerTickTask(this)。
BasicTaskScheduler::BasicTaskScheduler():fMaxNumSockets(0){FD_ZERO(&fReadSet);FD_ZERO(&fWriteSet);FD_ZERO(&fExceptionSet);schedulerTickTask(this);//ensuresthatwehandleeventsfrequently}
下面来介绍一下schedulerTickTask函数(调度滴答任务)
这个函数的作用就是将其参数转为(BasicTaskScheduler*)类型,然后调用
scheduleDelayedTask来调度(创建)一个延时任务。有意思的是,
这个延时任务程序就是这个函数自身,延时任务程序的参数也是其参数。延时时间是
10毫秒。这有点像是函数递归调用了。与之不同的是,如果不去调度任务,递归就是无效的。
#defineMAX_SCHEDULER_GRANULARITY10000//10microseconds:WewillreturntotheeventloopatleastthisoftenstaticvoidschedulerTickTask(void*clientData){((BasicTaskScheduler*)clientData)->scheduleDelayedTask(MAX_SCHEDULER_GRANULARITY,schedulerTickTask,clientData);}析构函数是空的,就不说了。只要知道,在析构的时候会调用基类的析构函数。
相关文章推荐
- OCP-1Z0-051-2015-20题
- win32收不到F10按键消息解决办法
- 59.Spiral Matrix II
- int类型取值范围
- NSString什么时候用copy,什么时候用strong
- linux自动重启tomcat脚本
- android activity切换效果实现
- RecyclerView使用介绍
- [Flash 3D] 又是一个难题解决了。(Flash3D在android中运行)
- HTTP状态码的含义
- Linux 7.2 iptables
- 6.25 被虐记 6 期末测试 变相求和
- 机器学习中的范数规则化之(二)核范数与规则项参数选择
- C#/IOS/Android通用加密解密方法
- BZOJ3884 上帝与集合的正确用法
- POJ 3210 : Coins
- upper_bound和lower_bound的用法
- 编写一个排序函数,实现数字排序。排序方法由客户函数实现,函数参数个数为两个,两个参数的关系作为排序后的元素间的关系。
- POJ 3210 : Coins
- 变量存储类型