Live555源码阅读笔记(二):UsageEnvironment 目录详解

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

Live555源码阅读笔记(二):UsageEnvironment 目录详解

Live555源码阅读笔记(三):BasicUsageEnvironment 目录详解

目录

一、UsageEnvironment 目录介绍

二、阅读源码

1、UsageEnvironment 类

2、TaskScheduler 类

3、HashTable类

4、UsageEnvironment 目录其他文件

总结


一、UsageEnvironment 目录介绍

  

这个目录包括了8个源码文件,主要内容是定义了3个抽象类,“UsageEnvironment”类和“TaskScheduler”类用于调度延迟任务、为异步读取事件分配任务 以及 输出错误/警告消息。 此外,“HashTable”类定义了通用哈希表的接口,供其余代码使用。因为这个目录代码量少,且代码简单与其他库没太多关联,所以放在陈述。

二、阅读源码

1、UsageEnvironment 类

UsageEnvironment 类是一个抽象基类,它定义了好几个纯虚函数,用来规范(要实例化的)子类必须实现这些函数。这个类主要用来输出错误/警告信息的,整个类几乎都是纯虚函数,只需要了解这些纯虚函数大概是有什么用就行了。下面简单阐述一下。

1.1、跟 “错误/警告信息字符串” 相关的函数

typedef char const* MsgString;
virtual MsgString getResultMsg() const = 0;

virtual void setResultMsg(MsgString msg) = 0;
virtual void setResultMsg(MsgString msg1, MsgString msg2) = 0;
virtual void setResultMsg(MsgString msg1, MsgString msg2, MsgString msg3) = 0;
virtual void setResultErrMsg(MsgString msg, int err = 0) = 0;
virtual void appendToResultMsg(MsgString msg) = 0;
virtual void reportBackgroundError() = 0;

1.2、跟 “重载<<运算符” 相关的函数

// 'console' output:
virtual UsageEnvironment& operator<<(char const* str) = 0;
virtual UsageEnvironment& operator<<(int i) = 0;
virtual UsageEnvironment& operator<<(unsigned u) = 0;
virtual UsageEnvironment& operator<<(double d) = 0;
virtual UsageEnvironment& operator<<(void* p) = 0;

2、TaskScheduler 类

TaskScheduler  类也是一个抽象基类,同样定义了好几个纯虚函数要求子类实现,主要跟“任务调度”、“后台处理”、“事件触发器”相关。下面简单介绍一下。

2.1、延时任务相关函数

/* 
*功能:安排一个延时任务在下次调度点到达时调度,当microseconds<=0时,不延时
*参数:
*  microseconds: 延时的微妙数
*  proc:任务名称
*  clientData:传给任务的数据
*返回值:返回一个令牌(TaskToken),可以在任务被调度前调用 unscheduleDelayedTask()取消或者
*       调用 rescheduleDelayedTask() 重新安排该任务。
*/
virtual TaskToken scheduleDelayedTask(int64_t microseconds,TaskFunc* proc,void* clientData) = 0;

// 取消延迟指定的任务
virtual void unscheduleDelayedTask(TaskToken& prevTask) = 0;

// 重新安排延迟任务,会更改task为新的令牌(Token)
virtual void rescheduleDelayedTask(TaskToken& task,
                     int64_t microseconds, TaskFunc* proc,
				     void* clientData);

// 使任务在事件循环中进一步执行,
// 将延迟任务、后台I/O处理和其他事件作为单个控制线程按顺序处理。
virtual void doEventLoop(char volatile* watchVariable = NULL) = 0;

2.2、事件触发器相关函数

/* 创建一个事件触发器:将 eventHandlerProc 添加到事件循环中,并返回一个id,
如果id被触发,就从事件循环中调用 eventHandlerProc。*/
virtual EventTriggerId createEventTrigger(TaskFunc* eventHandlerProc) = 0;

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

// 触发事件:使事先创建的指定事件处理函数从事件循环中处理。
virtual void triggerEvent(EventTriggerId eventTriggerId, void* clientData = NULL) = 0;

2.3、后台处理相关

typedef void BackgroundHandlerProc(void* clientData, int mask);
    // Possible bits to set in "mask".  (These are deliberately defined
    // the same as those in Tcl, to make a Tcl-based subclass easy.)
    #define SOCKET_READABLE    (1<<1)
    #define SOCKET_WRITABLE    (1<<2)
    #define SOCKET_EXCEPTION   (1<<3)
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;

结合上面的介绍看代码,可以大概了解 TaskScheduler  类。

3、HashTable类

HashTable 类也是一个抽象基类,主要用于实现哈希表,感兴趣的,可以自己了解一下。

4、UsageEnvironment 目录其他文件

除了上面提及的3个类外,UsageEnvironment 目录就剩下的4个源文件了。

strDup.hh、strDup.cpp:实现字符串的复制,等同于标准 C 的 "strdup()"。

Boolean.hh:定义了布尔值

UsageEnvironment_version.hh:定义了当前源码的版本好

三、总结

UsageEnvironment 目录的代码数量很少,也浅显易懂,主要了解 UsageEnvironment 类 和 TaskScheduler  类规范了哪些行为即可。怕忘记了,在此记录一下。

补充说明:

1、上面阅读的代码是 2019.03.06 的

#define USAGEENVIRONMENT_LIBRARY_VERSION_STRING    "2019.03.06"

2、涉及的C++知识

纯虚函数:

声明:virtual retType Fun() = 0; // retType 表示返回值类型、Fun-函数名

形式:
①最开头有 virtual 关键字
②没有函数体
③函数声明的末尾有“=0”,告诉编译系统“这是纯虚函数”,并不是返回值; 

作用:
①含有纯虚函数的类称为抽象类,抽象类只能被继承,不能实例化,可声明指向“实现该抽象类的具体类”的指针或引用。
②不能被调用,规范子类必须实现该函数(声明中不能有“=0”),否则报错
③没实现纯虚函数的子类,则该子类仍为抽象类
④实现了纯虚函数的子类,该纯虚函数在子类中就成了虚函数

const函数:

声明:retType Fun() const; // retType 表示返回值类型、Fun-函数名

形式:在函数名后面的括号加了 const 修饰

作用:
①const函数只能读取成员 不能修改,除非成员变量修饰成mutable
②const函数只能调用const函数 不能调用非const函数。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wkd_007

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值