一、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: 延时的微妙数 * proc:任务名称 * clientData:传给任务的数据 *返回值:返回一个令牌(TaskToken),可以在任务被调度前调用 unscheduleDelayedTask()取消或者 * 调用 rescheduleDelayedTask() 重新安排该任务。 */ virtual TaskToken scheduleDelayedTask(int64_t microseconds,TaskFunc* proc,void* clientData) = 0; // 取消延迟指定的任务 virtual void unscheduleDelayedTask(TaskToken& prevTask) = 0; // 重新安排延迟任务 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函数。