zoukankan      html  css  js  c++  java
  • 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,实现有点差别,但是原理是一致的。

    1     int fMaxNumSockets;     //最大的socket数,select调用时提高效率
    2     fd_set fReadSet;        //监控读操作的集合
    3     fd_set fWriteSet;       //监控写操作的集合
    4     fd_set fExceptionSet;   //监控有异常的集合

    BasicTaskScheduler基本任务调度器

    BasicTaskScheduler基本任务调度器

    BasicTaskScheduler基本任务调度器的定义

     1 class BasicTaskScheduler : public BasicTaskScheduler0 {
     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);
    }

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

  • 相关阅读:
    github 访问速度慢 的解决+个人理解
    phpstorm 编辑器进行自动的注释添加
    输入框只能输入数字(最好用)
    数组去重(根据对象属性去重)
    mac安装Homebrew和 tree
    vue中 .sync 的作用
    打包 vue 组件为 webcomponent
    Android开发之SharedPreferences
    Android开发之SharedPreferences扩展以及File
    Android 开发之SQLite基础
  • 原文地址:https://www.cnblogs.com/oloroso/p/4599996.html
Copyright © 2011-2022 走看看