这是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中提过。

  1. typedef void TaskFunc(void* clientData);
  2. typedef void* TaskToken; //token 标志
  3. typedef u_int32_t EventTriggerId; //Trigger 触发

TaskScheduler的定义如下

  1. //任务调度器
  2. class TaskScheduler {
  3. public:
  4. virtual ~TaskScheduler();
  5. /* 这是一个纯虚接口,在BasicTaskScheduler0中有一个实现*/
  6. virtual TaskToken scheduleDelayedTask(int64_t microseconds, TaskFunc* proc,
  7. void* clientData) = 0;
  8. /* 这是一个纯虚接口,在BasicTaskScheduler0中有一个实现*/
  9. virtual void unscheduleDelayedTask(TaskToken& prevTask) = 0;
  10. // 没有影响,如果 prevTask == NULL
  11. // 完成之后将设置 prevTask 为NULL
  12. // 虚接口,重新调度延时任务
  13. // 先调用unscheduleDelayedTask(task);
  14. // 在调用task = scheduleDelayedTask(microseconds, proc, clientData);
  15. virtual void rescheduleDelayedTask(TaskToken& task,
  16. int64_t microseconds, TaskFunc* proc,
  17. void* clientData);
  18. // For handling socket operations in the background (from the event loop):
  19. // 后台处理套接字操作类型(从事件循环):注意,这是一个类型定义
  20. typedef void BackgroundHandlerProc(void* clientData, int mask);
  21. // 设置掩码位为mask,这是特意这样定义的,为了符合Tcl接口的一致性
  22. // Tcl 是“工具控制语言(Tool Control Language)”的缩写。Tk 是 Tcl“图形工具箱”的扩展
  23. // 它提供各种标准的 GUI 接口项,以利于迅速进行高级应用程序开发
  24. #define SOCKET_READABLE (1<<1) //readable adj.易读的; 易懂的;
  25. #define SOCKET_WRITABLE (1<<2) //writable adj.可写下的,能写成文的;
  26. #define SOCKET_EXCEPTION (1<<3) //exception n.例外,除外; 反对,批评;[法律]异议,反对;
  27. //设置后台处理
  28. virtual void setBackgroundHandling(int socketNum, int conditionSet, BackgroundHandlerProc* handlerProc, void* clientData) = 0;
  29. //禁用后台处理
  30. void disableBackgroundHandling(int socketNum) { setBackgroundHandling(socketNum, 0, NULL, NULL); }
  31. virtual void moveSocketHandling(int oldSocketNum, int newSocketNum) = 0;
  32. // Changes any socket handling for "oldSocketNum" so that occurs with "newSocketNum" instead.
  33. // 改变任何套接字操作“oldsocketnum”,发生在“newsocketnum”代替。
  34. virtual void doEventLoop(char* watchVariable = NULL) = 0;
  35. //创建一个事件触发器
  36. virtual EventTriggerId createEventTrigger(TaskFunc* eventHandlerProc) = 0;
  37. //删除一个事件触发器
  38. virtual void deleteEventTrigger(EventTriggerId eventTriggerId) = 0;
  39. //触发事件
  40. virtual void triggerEvent(EventTriggerId eventTriggerId, void* clientData = NULL) = 0;
  41. //以下两个功能是过时的,并提供仅为了向后兼容
  42. void turnOnBackgroundReadHandling(int socketNum, BackgroundHandlerProc* handlerProc, void* clientData) {
  43. setBackgroundHandling(socketNum, SOCKET_READABLE, handlerProc, clientData);
  44. }
  45. void turnOffBackgroundReadHandling(int socketNum) { disableBackgroundHandling(socketNum); }
  46. //内部错误
  47. virtual void internalError(); // used to 'handle' a 'should not occur'-type error condition within the library.
  48. protected:
  49. TaskScheduler(); // abstract base class 抽象基类
  50. };

virtual void internalError()方法

因为TaskScheduler只实现了两个方法,所以还是说一说了。这个方法调用了库函数abort()。abrot函数作用是引发不正常进程的终止。这是用于在发生了内部错误的情况下,不得作出终止当前进程的决定。

在这个函数的实现处,有一行注释,翻译为中文大概意思是:默认情况下,我们处理的不应该发生的错误的类型调用abort()库函数。子类可以重新定义,如果需要的话。

  1. // By default, we handle 'should not occur'-type library errors by calling abort(). Subclasses can redefine this, if desired.
  2. void TaskScheduler::internalError() {
  3. abort();
  4. }

rescheduleDelayedTask重新调度延时任务

这个方法确实是在TaskScheduler中实现的,但是其调用的两个方法都是在其派生类中实现的。这个方法先取消一个任务的调度,然后重新调度这个任务。

  1. void TaskScheduler::rescheduleDelayedTask(TaskToken& task,
  2. int64_t microseconds, TaskFunc* proc,
  3. void* clientData) {
  4. unscheduleDelayedTask(task);
  5. task = scheduleDelayedTask(microseconds, proc, clientData);
  6. }

18 TaskScheduler任务调度器抽象基类——Live555源码阅读(一)任务调度相关类的更多相关文章

  1. 21 BasicTaskScheduler基本任务调度器(一)——Live555源码阅读(一)任务调度相关类

    21_BasicTaskScheduler基本任务调度器(一)——Live555源码阅读(一)任务调度相关类 BasicTaskScheduler基本任务调度器 BasicTaskScheduler基 ...

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

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

  3. 13 HashTable抽象哈希表类——Live555源码阅读(一)基本组件类

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

  4. 8 延时队列相关类——Live555源码阅读(一)基本组件类

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

  5. 9 DelayQueueEntry 延时队列节点类——Live555源码阅读(一)基本组件类

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

  6. 10 DelayQueue 延时队列类——Live555源码阅读(一)基本组件类

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

  7. 7 HandlerSet 处理程序链表类——Live555源码阅读(一)基本组件类

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

  8. 6 HandlerDescriptor 处理程序描述类——Live555源码阅读(一)基本组件类

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

  9. 11 AlarmHandler定时处理类——Live555源码阅读(一)基本组件类

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

随机推荐

  1. 以全局监听的方式处理img的error事件

    http://www.ovaldi.org/2015/09/11/%E4%BB%A5%E5%85%A8%E5%B1%80%E7%9B%91%E5%90%AC%E7%9A%84%E6%96%B9%E5% ...

  2. 下面是Webstorm的一些常用快捷键:

    1. ctrl + shift + n: 打开工程中的文件,目的是打开当前工程下任意目录的文件.2. ctrl + j: 输出模板3. ctrl + b: 跳到变量申明处4. ctrl + alt + ...

  3. Apache源码包安装和子配置文件介绍--update.2014-12-5

    安装apache: 官网:http://httpd.apache.org/download.cgi#apache24 1.wget http://mirror.bit.edu.cn/apache//h ...

  4. Jsp与servlet的区别

     Jsp与servlet的区别 2011-12-09 16:27:47 分类: Java 1.jsp经编译后就变成了Servlet.(JSP的本质就是Servlet,JVM只能识别java的类,不能识 ...

  5. Yii2 如何更好的在页面注入JavaScript

    先添加一个widgets <?php /** * User: yiqing * Date: 14-9-15 * Time: 下午12:09 */ namespace common\widgets ...

  6. Jetty与tomcat的比较

    Google 应用系统引擎最初是以 Apache Tomcat 作为其 webserver/servlet 容器的,但最终将切换到 Jetty 上. 这个决定让许多开发人员都诧异的想问:为什么要做这样 ...

  7. iOS- Terminating app due to uncaught exception 'NSRangeException'

    错误描述: Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM object ...

  8. winScp上传文件时,如何过滤制定文件

    在用winScp上传文件时,有些文件不想上传到服务器上.怎么办呢? 比如我希望过滤.svn .git文件和目录怎么操作呢? 第一步:在菜单上选中选项,点击选项. 第二步,点击传输->编辑 第三步 ...

  9. Google翻译请求(难点是tk参数)

    业务需求需要将一些文字翻译一下··· 但是直接调用接口收费啊啊啊啊(貌似是前几百万字免费,然后就开始收费了)···· 就想研究一下Google翻译接口... 想模拟Google向服务器发送一个Http ...

  10. nyoj 364 田忌赛马(贪心)

    田忌赛马 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 Here is a famous story in Chinese history. "That ...