• EasyDarwin Streaming Server对Task的调用方法


    我们在EasyDarwin流媒体服务器的二次开发过程中,经常会需要定义自己的Task类,例如在EasyDarwin中,RTSPSessioin、HTTPSession、RTCPTask等,都是Task,Task是Darwin任务调度的对象,或者打个比方,Task就像是平时快递的包裹一样,包裹有各种各样的:衣服、鞋子、袜子、手机、电脑等等,各种各样,包裹的流程:新建、传输、投递、处理,整个过程,Task从创建、Signal投递到TaskThread任务队列、Task::Run()取出处理,跟包裹的处理原理是一样的;

    Darwin中,几乎所有的工作完成都是用Task来进行包裹处理的,这里我们简单自定义一个Task:

    //MyTask
    class MyTask : public Task
    {
        public:
            MyTask() : Task() {this->SetTaskName("MyTask"); }
            virtual ~MyTask() {}
        
        private:
            virtual SInt64 Run();
    };

    例如这里,我们定义了一个Task类MyTask,那么我们可以新建一个MyTask的对象,然后将MyTask对象投递到TaskThread任务队列里面,等待Darwin底层任务处理队列进行处理:

    //创建MyTask对象
    MyTask* myTask = new MyTask();
    
    //投递到Task任务队列中,定义事件类型为kStartEvent
    myTask->Signal(Task::kStartEvent);

    如上,我们创建了一个MyTask的任务,投递到了任务队列中,同时还定义了投递的任务事件类型(类型可以自己定义),这样做的好处就是:能够充分利用处理Task的线程池,而且保证了任务处理的灵活性,下面我们再看上面投递的任务如何进行处理的:

    SInt64 MyTask::Run()
    {
    	//获取事件类型,同时能够清空投递的事件类型,避免Run()一直重复被调用
        EventFlags events = this->GetEvents();
    
    	if(events & Task::kTimeoutEvent)
    	{
    		qtss_printf("超时事件处理");
    	}
    	if(events & Task::kKillEvent)
    	{
    		qtss_printf("析构事件处理");
    	}
    	if(events & Task::kReadEvent)
    	{
    		qtss_printf("网络读取事件处理:进行Socket读取");
    	}
        ...
    
        return 1000;//小于0表示删除此Task对象;等于0表示有Signal再调用到时Run;大于0表示多少毫秒后再次执行Run
    }


    这样的话,一个完整的Task调用过程就有了,Task的使用方法很灵活,可以用在很多方面,例如任务执行、循环检测、多线程,具体大家可以参考EasyDarwin中RTSPSession、RTCPTask等类的实现方式!


    获取更多信息

    邮件:support@easydarwin.org

    WEB:www.EasyDarwin.org

    Copyright © EasyDarwin.org 2013-2016

    EasyDarwin


  • 相关阅读:
    IntentService使用以及源码分析
    Android HandlerThread源码解析
    Android Handler消息机制源码解析
    Gradle技术之四
    Android EditText实现小数点后几位的终级方案
    Gradle系列之三 Gradle概述以及生命周期
    Gradle系列之二 Groovy对文件的操作
    Gradle系列之一 Groovy语法精讲
    Context源码分析
    用EXCLE群发outlook邮件
  • 原文地址:https://www.cnblogs.com/babosa/p/5904673.html
Copyright © 2020-2023  润新知