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

本文由乌合之众 lym瞎编,欢迎转载 http://www.cnblogs.com/oloroso/
本文由乌合之众 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 触发

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

转载于:https://www.cnblogs.com/oloroso/p/4599955.html

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

  1. 12 哈希表相关类——Live555源码阅读(一)基本组件类

    12 哈希表相关类--Live555源码阅读(一)基本组件类 这是Live555源码阅读的第一部分,包括了时间类,延时队列类,处理程序描述类,哈希表类这四个大类. 本文由乌合之众 lym瞎编,欢迎转载 ...

  2. 24 UsageEnvironment使用环境抽象基类——Live555源码阅读(三)UsageEnvironment

    24 UsageEnvironment使用环境抽象基类--Live555源码阅读(三)UsageEnvironment 24 UsageEnvironment使用环境抽象基类--Live555源码阅读 ...

  3. 17 任务调度相关类综述——Live555源码阅读(一)任务调度相关类

    这是Live555源码阅读的第二部分,包括了任务调度相关的三个类.任务调度是Live555源码中很重要的部分. 本文由乌合之众 lym瞎编,欢迎转载 http://www.cnblogs.com/ol ...

  4. 16 BasicHashTable基本哈希表类(三)——Live555源码阅读(一)基本组件类

    这是Live555源码阅读的第一部分,包括了时间类,延时队列类,处理程序描述类,哈希表类这四个大类. 本文由乌合之众 lym瞎编,欢迎转载 http://www.cnblogs.com/oloroso ...

  5. Live555源码阅读笔记(一):源码介绍文档 及 源码目录结构

    目录 一.Live555介绍 1.Live555项目介绍 2.官网及帮助文档介绍 二.源码目录结构 1.UsageEnvironment 2.BasicUsageEnvironment 3.group ...

  6. 39 网络相关函数(七)——live555源码阅读(四)网络

    39 网络相关函数(七)--live555源码阅读(四)网络 39 网络相关函数(七)--live555源码阅读(四)网络 简介 14)readSocket从套接口读取数据 recv/recvfrom ...

  7. Live555源码阅读笔记(四):groupsock 目录详解

    一.groupsock 目录介绍 groupsock 目录总共有16个源码文件,编译后生成 libgroupsock.a,这个库中的类封装了网络接口和套接字,特别是"Groupsock&qu ...

  8. Go调度器系列(4)源码阅读与探索

    各位朋友,这次想跟大家分享一下Go调度器源码阅读相关的知识和经验,网络上已经有很多剖析源码的好文章,所以这篇文章不是又一篇源码剖析文章,注重的不是源码分析分享,而是带给大家一些学习经验,希望大家能更好 ...

  9. Java多线程类FutureTask源码阅读以及浅析

    FutureTask是一个具体的实现类,实现了RunnableFuture接口,RunnableFuture分别继承了Runnable和Future接口,因此FutureTask类既可以被线程执行,又 ...

最新文章

  1. 在if里赋值要注意=和==的优先级,==优先于=
  2. 普通幕僚:Ownership意识不足的几种症状
  3. [译]Spring Session 与 Spring Security
  4. Linux MTD系统剖析【转】
  5. 设计模式之单例设计模式(饿汉式)
  6. UML图系列——UML模型图的构成
  7. 解决oracle中文数据乱码的问题
  8. matlab 的cat函数
  9. 浅析BMP位图文件结构(含Demo)[转]
  10. nosql----redis数据恢复方案
  11. docker 与宿主共享文件
  12. 安全跑路指南2013之乌云版
  13. Linux操作系统原理与应用(陈莉君)——学习笔记
  14. ResNet(残差网络)之残差模块
  15. 华为云服务器怎么样?华为云服务器有什么优势?
  16. 高低温测试试验方法有哪些?
  17. SONET 的OC 级/STS 级与SDH 的STM 级的对应关系(转)
  18. 直播公司转让,转让直播文网文-网络文化经营许可证
  19. 白嫖服务器——搭建个人简历网站(转载)
  20. ios QQ登录已经安装QQ客户端但仍然提示下载QQ,您没有安装最新版本qq

热门文章

  1. C语言 底层IO readwrite
  2. python regex应用
  3. 3.2 为超参数选择合适的范围
  4. sorted(iterable[, key][, reverse])
  5. linux对某个文件进行操作步骤,实验二 Linux系统简单文件操作命令
  6. 信息安全完全参考手册之安全设计原则(第四章)
  7. 看完这个故事,你就知道程序员为什么选公司就要去上升期的
  8. Java基础学习总结(87)——坚持写Java等技术类博客的好处
  9. 气缸标识上vr什么意思_汽车VR传感器是什么意思?
  10. java合并两个数组_「JAVA」两个数组的交集—力扣每日一题(一)