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

来源:互联网 发布:万得金融数据客户端 编辑:程序博客网 时间:2024/05/29 04:35
TaskScheduler任务调度器抽象基类
TaskScheduler是一个抽象基类,其定义在live555sourcecontrol\UsageEnvironment\include\UsageEnvironment.hh文件中。
TaskScheduler声明了很多纯虚接口,其实现一般在class BasicTaskScheduler0中。这里简要介绍一下。
TaskScheduler的默认构造函数是protected权限的,也就是只能被其内部的或派生类的方法调用。
这里先列出三个类型定义,这个在后面就不介绍了。在前面AlarmHandler中提过。
//任务调度器
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 抽象基类
};

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

void TaskScheduler::rescheduleDelayedTask(TaskToken& task,
                      int64_t microseconds, TaskFunc* proc,
                      void* clientData) {
  unscheduleDelayedTask(task);
  task = scheduleDelayedTask(microseconds, proc, clientData);
}



TaskScheduler任务调度器抽象基类
TaskScheduler是一个抽象基类,其定义在live555sourcecontrol\UsageEnvironment\include\UsageEnvironment.hh文件中。
TaskScheduler声明了很多纯虚接口,其实现一般在class BasicTaskScheduler0中。这里简要介绍一下。
TaskScheduler的默认构造函数是protected权限的,也就是只能被其内部的或派生类的方法调用。
这里先列出三个类型定义,这个在后面就不介绍了。在前面AlarmHandler中提过。
//任务调度器
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 抽象基类
};

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

void TaskScheduler::rescheduleDelayedTask(TaskToken& task,
                      int64_t microseconds, TaskFunc* proc,
                      void* clientData) {
  unscheduleDelayedTask(task);
  task = scheduleDelayedTask(microseconds, proc, clientData);
}




http://www.cnblogs.com/oloroso/p/4599955.html


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 有鼻毛漏出来了怎么办 被螃蟹夹了肿了怎么办 吃了死了的螃蟹怎么办 被沙漠蝎子咬到怎么办 明台手表掉了怎么办 如果撞了豪车怎么办 车子陷到泥巴里怎么办 乳房一生气就疼怎么办 4s屏幕不显示怎么办 雷神红蜘蛛掉漆怎么办 桔子树根部霉了怎么办 电脑u盘被禁用怎么办 机房u盘限制了怎么办 蜘蛛爬到人身上怎么办 房间里有蛐蛐叫怎么办 养的雨林蝎跑了怎么办 多肉长得太高了怎么办 手被蝎子咬了怎么办 被蝎子蛰住了怎么办 小孩被蝎子蜇了怎么办 孕妇被蝎子蛰了怎么办 怀孕被蝎子蜇了怎么办 孩子被蝎子蛰了怎么办 手被蝎子蛰了怎么办 被东亚钳蝎蛰了怎么办 孕37周羊水过多怎么办 孕38周羊水过多怎么办 孕39周羊水过多怎么办 生完孩子腿关节疼怎么办 手指上长了倒刺怎么办 肥肉吃多了恶心怎么办 大便粘稠怎么回事还便秘怎么办 狗狗大便次数多怎么办 宝宝拉白色稀便怎么办 5个月宝宝流鼻涕怎么办 5个月婴儿流鼻涕怎么办 五个月宝宝流鼻涕鼻塞怎么办 4个月宝宝流鼻涕怎么办 大便经常是稀的怎么办 拉黑色的稀大便怎么办 孕晚期半夜饿了怎么办