博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
18 TaskScheduler任务调度器抽象基类——Live555源码阅读(一)任务调度相关类
阅读量:7218 次
发布时间:2019-06-29

本文共 3719 字,大约阅读时间需要 12 分钟。

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

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 触发

TaskScheduler1

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

转载地址:http://notym.baihongyu.com/

你可能感兴趣的文章
HTML5适应旧的浏览器的使用总结
查看>>
vi全局替换方法
查看>>
MySQL基础入门学习【1】基本操作
查看>>
初版python计算器
查看>>
CSS实现单行、多行文本溢出显示省略号(…)
查看>>
HDU 2444 The Accomodation of Students
查看>>
zabbix 源码编译安装
查看>>
:before和::before的区别
查看>>
P2261 [CQOI2007]余数求和
查看>>
浮点运算潜在的结果不一致问题
查看>>
完成端口(Completion Port)详解
查看>>
Luxand_FaceSDK_Documentation.pdf
查看>>
iOS下bound,center和frame
查看>>
sql 集合查询 数据更新操作语句
查看>>
REP 前缀
查看>>
js高级程序设计(六)面向对象
查看>>
C# JS URL 中文传参出现乱码的解决方法
查看>>
OO第三单元作业总结
查看>>
[译]从零开始成为数据科学家的9个步骤
查看>>
Python 10 MySQL数据库(一)
查看>>