风吹过


以前,晚餐后在学校田径场的大榕树下,散散步吹吹风,累了就去图书馆看看书,感觉真好。


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

[TOC] 博客园文章地址 http://www.cnblogs.com/oloroso/archive/2015/06/25/4599996.html

这是Live555源码阅读的第二部分,包括了任务调度相关的三个类。任务调度是Live555源码中很重要的部分。

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

BasicTaskScheduler::BasicTaskScheduler()

fMaxNumSockets(0) { 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);
}

 

析构函数是空的,就不说了。只要知道,在析构的时候会调用基类的析构函数。

#008080;“> 2 public: 3 static BasicTaskScheduler createNew(); 4 virtual ~BasicTaskScheduler(); 5 6 protected: 7 BasicTaskScheduler(); 8 // called only by “createNew()” 9 10 protected: 11 // Redefined virtual functions: 12 13 / 14 * 设置select的超时时间为maxDelayTime(<=0 或大于一百万秒 时1百万秒) 15 * 调用int selectResult = select(fMaxNumSockets, &readSet, &writeSet, &exceptionSet, &tv_timeToDelay); 16 * 如果select出错返回,打印出错信息,并调用 internalError函数 17 * 从处理程序描述链表中查找fLastHandledSocketNum代表的 处理程序描述对象指针,如果没找到,就在后面的while的时候从链表的头开始,否则从找到的位置开始 18 * 从链表中取出处理程序描述节点对象,并调用其内部保存的处理程序 19 * 设置fTriggersAwaitingHandling 20 * 调用fDelayQueue.handleAlarm(); 21 / 22 virtual void SingleStep(unsigned maxDelayTime); 23 // 添加到后台处理 24 virtual void setBackgroundHandling(int socketNum, int conditionSet, BackgroundHandlerProc handlerProc, void* clientData); 25 // 从后台处理移出 26 virtual void moveSocketHandling(int oldSocketNum, int newSocketNum); 27 28 protected: 29 // To implement background operations: 实施后台操作 30 int fMaxNumSockets; //最大的socket数,select调用时提高效率 31 fd_set fReadSet; //监控读操作的集合 32 fd_set fWriteSet; //监控写操作的集合 33 fd_set fExceptionSet; //监控有异常的集合 34 };

 


BasicTaskScheduler的构造与析构

BasicTaskScheduler的构造函数是protected权限的,其只在静态方法createNew中被调用。
创建的时候清零了四个成员,并调用了schedulerTickTask(this)。
BasicTaskScheduler::BasicTaskScheduler()

fMaxNumSockets(0) { 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);
}

 

析构函数是空的,就不说了。只要知道,在析构的时候会调用基类的析构函数。