18 TaskScheduler任务调度器抽象基类——Live555源码阅读(一)任务调度相关类

可莉
• 阅读 663

#18 TaskScheduler任务调度器抽象基类——Live555源码阅读(一)任务调度相关类

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

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

##TaskScheduler任务调度器抽象基类

TaskScheduler是一个抽象基类,其定义在live555sourcecontrol\UsageEnvironment\include\UsageEnvironment.hh文件中。 TaskScheduler声明了很多纯虚接口,其实现一般在class BasicTaskScheduler0中。这里简要介绍一下。 TaskScheduler的默认构造函数是protected权限的,也就是只能被其内部的或派生类的方法调用。 这里先列出三个类型定义,这个在后面就不介绍了。在前面AlarmHandler中提过。

typedef void TaskFunc(void* clientData);
typedef void* TaskToken;    //token 标志
typedef u_int32_t EventTriggerId;    //Trigger 触发

18 TaskScheduler任务调度器抽象基类——Live555源码阅读(一)任务调度相关类

##TaskScheduler的定义如下

//任务调度器
class TaskScheduler {
public:
    virtual ~TaskScheduler();

    /* 这是一个纯虚接口,在BasicTaskScheduler0中有一个实现*/
    virtual TaskToken scheduleDelayedTask(int64_t microseconds, TaskFunc* proc,
        void* clientData) = 0;
    /* 这是一个纯虚接口,在BasicTaskScheduler0中有一个实现*/
    virtual void unscheduleDelayedTask(TaskToken& prevTask) = 0;
    // 没有影响,如果 prevTask == NULL
    // 完成之后将设置 prevTask 为NULL

    // 虚接口,重新调度延时任务
    // 先调用unscheduleDelayedTask(task);
    // 在调用task = scheduleDelayedTask(microseconds, proc, clientData);
    virtual void rescheduleDelayedTask(TaskToken& task,
        int64_t microseconds, TaskFunc* proc,
        void* clientData);

    // For handling socket operations in the background (from the event loop):
    // 后台处理套接字操作类型(从事件循环):注意,这是一个类型定义
    typedef void BackgroundHandlerProc(void* clientData, int mask);
    // 设置掩码位为mask,这是特意这样定义的,为了符合Tcl接口的一致性
    // Tcl 是“工具控制语言(Tool Control Language)”的缩写。Tk 是 Tcl“图形工具箱”的扩展
    // 它提供各种标准的 GUI 接口项,以利于迅速进行高级应用程序开发

#define SOCKET_READABLE    (1<<1)    //readable  adj.易读的;   易懂的;   
#define SOCKET_WRITABLE    (1<<2)    //writable  adj.可写下的,能写成文的; 
#define SOCKET_EXCEPTION   (1<<3)    //exception n.例外,除外; 反对,批评;[法律]异议,反对;

    //设置后台处理
    virtual void setBackgroundHandling(int socketNum, int conditionSet, BackgroundHandlerProc* handlerProc, void* clientData) = 0;
    //禁用后台处理
    void disableBackgroundHandling(int socketNum) { setBackgroundHandling(socketNum, 0, NULL, NULL); }
    virtual void moveSocketHandling(int oldSocketNum, int newSocketNum) = 0;
    // Changes any socket handling for "oldSocketNum" so that occurs with "newSocketNum" instead.
    // 改变任何套接字操作“oldsocketnum”,发生在“newsocketnum”代替。

    virtual void doEventLoop(char* watchVariable = NULL) = 0;

    //创建一个事件触发器
    virtual EventTriggerId createEventTrigger(TaskFunc* eventHandlerProc) = 0;

    //删除一个事件触发器
    virtual void deleteEventTrigger(EventTriggerId eventTriggerId) = 0;

    //触发事件
    virtual void triggerEvent(EventTriggerId eventTriggerId, void* clientData = NULL) = 0;
    //以下两个功能是过时的,并提供仅为了向后兼容
    void turnOnBackgroundReadHandling(int socketNum, BackgroundHandlerProc* handlerProc, void* clientData) {
        setBackgroundHandling(socketNum, SOCKET_READABLE, handlerProc, clientData);
    }
    void turnOffBackgroundReadHandling(int socketNum) { disableBackgroundHandling(socketNum); }
    //内部错误
    virtual void internalError(); // used to 'handle' a 'should not occur'-type error condition within the library.
protected:
    TaskScheduler(); // abstract base class 抽象基类
};

##virtual void internalError()方法

因为TaskScheduler只实现了两个方法,所以还是说一说了。这个方法调用了库函数abort()。abrot函数作用是引发不正常进程的终止。这是用于在发生了内部错误的情况下,不得作出终止当前进程的决定。 在这个函数的实现处,有一行注释,翻译为中文大概意思是:默认情况下,我们处理的不应该发生的错误的类型调用abort()库函数。子类可以重新定义,如果需要的话。

// By default, we handle 'should not occur'-type library errors by calling abort().  Subclasses can redefine this, if desired.
void TaskScheduler::internalError() {
  abort();
}

##rescheduleDelayedTask重新调度延时任务

这个方法确实是在TaskScheduler中实现的,但是其调用的两个方法都是在其派生类中实现的。这个方法先取消一个任务的调度,然后重新调度这个任务。

void TaskScheduler::rescheduleDelayedTask(TaskToken& task,
                      int64_t microseconds, TaskFunc* proc,
                      void* clientData) {
  unscheduleDelayedTask(task);
  task = scheduleDelayedTask(microseconds, proc, clientData);
}
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
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
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
java目前可以通过以下几种方式进行定时任务
1、单机部署模式Timer:jdk中自带的一个定时调度类,可以简单的实现按某一频度进行任务执行。提供的功能比较单一,无法实现复杂的调度任务。ScheduledExecutorService:也是jdk自带的一个基于线程池设计的定时任务类。其每个调度任务都会分配到线程池中的一个线程执行,所以其任务是并发执行的,互不影响。
Stella981 Stella981
3年前
Elastic
JobScheduler是elasticjob作业调度的关键类,也是起始类,在包com.dangdang.ddframe.job.lite.api下。调度任务的执行需要包含两大步骤:任务的配置和任务的注册。JobScheduler的构造函数除了任务配置和注册相关信息之外还有事件和监听。后两者是elasticjob的扩展功能,我们后续再介绍。任务的配置
可莉 可莉
3年前
19_BasicTaskScheduler0 基本任务调度类基类(一)——Live555源码阅读(一
19\_BasicTaskScheduler0基本任务调度类基类(一)——Live555源码阅读(一)任务调度相关类这是Live555源码阅读的第二部分,包括了任务调度相关的三个类。任务调度是Live555源码中很重要的部分。本文由乌
可莉 可莉
3年前
22_BasicTaskScheduler基本任务调度器(二)——Live555源码阅读(一)任务调
22\_BasicTaskScheduler基本任务调度器(二)——Live555源码阅读(一)任务调度相关类\TOC\这是Live555源码阅读的第二部分,包括了任务调度相关的三个类。任务调度是Live555源码中很重要的部分。
可莉 可莉
3年前
21_BasicTaskScheduler基本任务调度器(一)——Live555源码阅读(一)任务调
21\_BasicTaskScheduler基本任务调度器(一)——Live555源码阅读(一)任务调度相关类\TOC\这是Live555源码阅读的第二部分,包括了任务调度相关的三个类。任务调度是Live555源码中很重要的部分。
可莉 可莉
3年前
20_BasicTaskScheduler0 基本任务调度类基类(二)——Live555源码阅读(一
20\_BasicTaskScheduler0基本任务调度类基类(二)——Live555源码阅读(一)任务调度相关类这是Live555源码阅读的第二部分,包括了任务调度相关的三个类。任务调度是Live555源码中很重要的部分。本文由乌
可莉 可莉
3年前
17 任务调度相关类综述——Live555源码阅读(一)任务调度相关类
17任务调度相关类综述——Live555源码阅读(一)任务调度相关类这是Live555源码阅读的第二部分,包括了任务调度相关的三个类。任务调度是Live555源码中很重要的部分。本文由乌合之众lym瞎编,欢迎转载my.oschi
Easter79 Easter79
3年前
Spring的业务层和Web层
任务调度  quartz框架  quartz框架实现了Spring的任务调度,用户可以随意的定义触发器调度时间表,并将触发器和任务进行映射。quartz通过调度器、触发器和任务实现任务调度。  Job:主要用来设计任务实现的逻辑,并且只有一个方法execute。  JobDetail:主要用来通过newInst