您的位置:首页 > 其它

21 BasicTaskScheduler基本任务调度器(一)——Live555源码阅读(一)任务调度相关类

2015-06-25 15:00 357 查看
21_BasicTaskScheduler基本任务调度器(一)——Live555源码阅读(一)任务调度相关类BasicTaskScheduler基本任务调度器BasicTaskScheduler基本任务调度器的定义BasicTaskScheduler的构造与析构下面来介绍一下schedulerTickTask函数(调度滴答任务)这是Live555源码阅读的第二部分,包括了任务调度相关的三个类。任务调度是Live555源码中很重要的部分。本文由乌合之众lym瞎编,欢迎转载
http://www.cnblogs.com/oloroso/
本文由乌合之众lym瞎编,欢迎转载
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);}
析构函数是空的,就不说了。只要知道,在析构的时候会调用基类的析构函数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
章节导航