zoukankan      html  css  js  c++  java
  • 18 TaskScheduler任务调度器抽象基类——Live555源码阅读(一)任务调度相关类

    这是Live555源码阅读的第二部分,包括了任务调度相关的三个类。任务调度是Live555源码中很重要的部分。

    本文由乌合之众 lym瞎编,欢迎转载 http://www.cnblogs.com/oloroso/
    本文由乌合之众 lym瞎编,欢迎转载 my.oschina.net/oloroso

    TaskScheduler任务调度器抽象基类

    TaskScheduler是一个抽象基类,其定义在live555sourcecontrolUsageEnvironmentincludeUsageEnvironment.hh文件中。
    TaskScheduler声明了很多纯虚接口,其实现一般在class BasicTaskScheduler0中。这里简要介绍一下。
    TaskScheduler的默认构造函数是protected权限的,也就是只能被其内部的或派生类的方法调用。
    这里先列出三个类型定义,这个在后面就不介绍了。在前面AlarmHandler中提过。

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

    TaskScheduler1

    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);
    }
    
  • 相关阅读:
    transformer的pytorch代码讲解
    idea 提交远程库冲突解决
    程序员文档编辑神器typora
    C#-Xamarin的Android项目开发(二)——控件应用
    2020最新全栈必备 Redis,你还不了解么
    2020JAVA最新应对各种OOM代码样例及解决办法
    java8中parallelStream提升数倍查询效率是怎样实现的,来看看这篇文章
    Spring当中循环依赖很少有人讲,今天一起来学习!
    PE 文件格式详解
    Mysql 添加字段、修改字段、删除字段
  • 原文地址:https://www.cnblogs.com/oloroso/p/4599955.html
Copyright © 2011-2022 走看看