18 TaskScheduler任务调度器抽象基类——Live555源码阅读(一)任务调度相关类
这是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);
}
18 TaskScheduler任务调度器抽象基类——Live555源码阅读(一)任务调度相关类的更多相关文章
- 21 BasicTaskScheduler基本任务调度器(一)——Live555源码阅读(一)任务调度相关类
21_BasicTaskScheduler基本任务调度器(一)——Live555源码阅读(一)任务调度相关类 BasicTaskScheduler基本任务调度器 BasicTaskScheduler基 ...
- 12 哈希表相关类——Live555源码阅读(一)基本组件类
12 哈希表相关类--Live555源码阅读(一)基本组件类 这是Live555源码阅读的第一部分,包括了时间类,延时队列类,处理程序描述类,哈希表类这四个大类. 本文由乌合之众 lym瞎编,欢迎转载 ...
- 13 HashTable抽象哈希表类——Live555源码阅读(一)基本组件类
这是Live555源码阅读的第一部分,包括了时间类,延时队列类,处理程序描述类,哈希表类这四个大类. 本文由乌合之众 lym瞎编,欢迎转载 http://www.cnblogs.com/oloroso ...
- 8 延时队列相关类——Live555源码阅读(一)基本组件类
这是Live555源码阅读的第一部分,包括了时间类,延时队列类,处理程序描述类,哈希表类这四个大类. 本文由乌合之众 lym瞎编,欢迎转载 http://www.cnblogs.com/oloroso ...
- 9 DelayQueueEntry 延时队列节点类——Live555源码阅读(一)基本组件类
这是Live555源码阅读的第一部分,包括了时间类,延时队列类,处理程序描述类,哈希表类这四个大类. 本文由乌合之众 lym瞎编,欢迎转载 http://www.cnblogs.com/oloroso ...
- 10 DelayQueue 延时队列类——Live555源码阅读(一)基本组件类
这是Live555源码阅读的第一部分,包括了时间类,延时队列类,处理程序描述类,哈希表类这四个大类. 本文由乌合之众 lym瞎编,欢迎转载 www.cnblogs.com/oloroso/ 本文由乌合 ...
- 7 HandlerSet 处理程序链表类——Live555源码阅读(一)基本组件类
这是Live555源码阅读的第一部分,包括了时间类,延时队列类,处理程序描述类,哈希表类这四个大类. 本文由乌合之众 lym瞎编,欢迎转载 my.oschina.net/oloroso Handler ...
- 6 HandlerDescriptor 处理程序描述类——Live555源码阅读(一)基本组件类
这是Live555源码阅读的第一部分,包括了时间类,延时队列类,处理程序描述类,哈希表类这四个大类. 本文由乌合之众 lym瞎编,欢迎转载 http://www.cnblogs.com/oloroso ...
- 11 AlarmHandler定时处理类——Live555源码阅读(一)基本组件类
这是Live555源码阅读的第一部分,包括了时间类,延时队列类,处理程序描述类,哈希表类这四个大类. 本文由乌合之众 lym瞎编,欢迎转载 http://www.cnblogs.com/oloroso ...
随机推荐
- Python标准库:内置函数hasattr(object, name)
Python标准库:内置函数hasattr(object, name) 本函数是用来判断对象object的属性(name表示)是否存在.如果属性(name表示)存在,则返回True,否则返回False ...
- codeforces 711B - Chris and Magic Square(矩阵0位置填数)
题目链接:http://codeforces.com/problemset/problem/711/B 题目大意: 输入 n ,输入 n*n 的矩阵,有一个占位 0 , 求得将 0 位置换成其他的整数 ...
- osharp3 整合 dbcontextscope 文章2 将dbcontext的创建收回到ioc管理
osharp3 整合 dbcontextscope 后,,dbcontextscope 对dbcontext管理的很好,做到,用到时创建,不用时销毁,下面看一个 trace aspx.page: En ...
- C#指定日期为一年中的第几周
/// <summary> /// 获取指定时间在为一年中为第几周 /// </summary> /// <param name="dt">指定 ...
- step 3 socket
socket 网络通讯三要素 IP地址(主机名) 网络中设备的标示 不易记忆,可以用主机名 本地回环地址:127.0.0.1 主机名:localhost 每台计算机都有一个 127.0.0.1 如果 ...
- Java TCP 程序
服务器采用BIO模式,每一个线程处理一个连接.问题出现在,如果使用BufferedReader去读取字符流,如果没有换行符的话,那么就会导致线程阻塞.因为调用了readLine()方法. import ...
- Emacs配置文件
;;tab and space;;when true,emacs use mixture of tab and space to archieve(setq-default indent-tabs-m ...
- 安装好Android Studio(如果内存足够可以改下as的内存)
找到studio的bin目录,找到如下文件
- webapp开发要点记录
1. iphone 各机型 机型 分辨率 像素比 物理分辨率 高* 宽 * 后 主屏对角线长度 重量 像素密度(ppi) iphone4/iphone4s 320 * 480 2 640 * 960 ...
- Tomcat6.0 管理器配置
最近忙着毕业答辩,填写材料,好多事情都给耽搁了!一个月都没有继续翻译tomcat,这回有点时间赶紧补上. 这部分,其实对开发者或者tomcat管理者来说,只要会登录页面管理器或者使用写简单的http就 ...