21_BasicTaskScheduler基本任务调度器(一)——Live555源码阅读(一)任务调

可莉
• 阅读 627

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

[TOC]

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

本文由乌合之众 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;    //监控有异常的集合

21_BasicTaskScheduler基本任务调度器(一)——Live555源码阅读(一)任务调

21_BasicTaskScheduler基本任务调度器(一)——Live555源码阅读(一)任务调

##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(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);
}

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


点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
可莉 可莉
2年前
19_BasicTaskScheduler0 基本任务调度类基类(一)——Live555源码阅读(一
19\_BasicTaskScheduler0基本任务调度类基类(一)——Live555源码阅读(一)任务调度相关类这是Live555源码阅读的第二部分,包括了任务调度相关的三个类。任务调度是Live555源码中很重要的部分。本文由乌
可莉 可莉
2年前
22_BasicTaskScheduler基本任务调度器(二)——Live555源码阅读(一)任务调
22\_BasicTaskScheduler基本任务调度器(二)——Live555源码阅读(一)任务调度相关类\TOC\这是Live555源码阅读的第二部分,包括了任务调度相关的三个类。任务调度是Live555源码中很重要的部分。
可莉 可莉
2年前
18 TaskScheduler任务调度器抽象基类——Live555源码阅读(一)任务调度相关类
18TaskScheduler任务调度器抽象基类——Live555源码阅读(一)任务调度相关类这是Live555源码阅读的第二部分,包括了任务调度相关的三个类。任务调度是Live555源码中很重要的部分。本文由乌合之众lym瞎编,欢
可莉 可莉
2年前
20_BasicTaskScheduler0 基本任务调度类基类(二)——Live555源码阅读(一
20\_BasicTaskScheduler0基本任务调度类基类(二)——Live555源码阅读(一)任务调度相关类这是Live555源码阅读的第二部分,包括了任务调度相关的三个类。任务调度是Live555源码中很重要的部分。本文由乌
可莉 可莉
2年前
17 任务调度相关类综述——Live555源码阅读(一)任务调度相关类
17任务调度相关类综述——Live555源码阅读(一)任务调度相关类这是Live555源码阅读的第二部分,包括了任务调度相关的三个类。任务调度是Live555源码中很重要的部分。本文由乌合之众lym瞎编,欢迎转载my.oschi
Easter79 Easter79
2年前
Spring的业务层和Web层
任务调度  quartz框架  quartz框架实现了Spring的任务调度,用户可以随意的定义触发器调度时间表,并将触发器和任务进行映射。quartz通过调度器、触发器和任务实现任务调度。  Job:主要用来设计任务实现的逻辑,并且只有一个方法execute。  JobDetail:主要用来通过newInst
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这