我们在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 Streaming Server对Task的调用方法的更多相关文章

  1. Darwin Streaming server 的 Task 类

    Darwin Streaming Server 是一个开放源代码的streaming server,对于streaming server的编程和软件结构有着一定的参考价值,它是使用C++写的,其中的并 ...

  2. Django在不启动server的情况下调用方法

    from django.conf import settingsfrom django import template settings.configure() a = template.Templa ...

  3. Darwin Streaming Server 简介

    Darwin Streaming Server     概要 Darwin Streaming Server简称DSS.DSS是Apple公司提供的开源实时流媒体播放服务器程序.整个程序使用C++编写 ...

  4. Darwin Streaming Server 核心代码分析

    基本概念 首先,我针对的代码是Darwin Streaming Server 6.0.3未经任何改动的版本. Darwin Streaming Server从设计模式上看,采用了Reactor的并发服 ...

  5. 连接Mysql提示Can’t connect to local MySQL server through socket的解决方法

    mysql,mysqldump,Mysqladmin,php连接mysql服务常会提示下面错误: ERROR 2002 (HY000): Can't connect to local MySQL se ...

  6. 启动Mysql服务提示Can’t connect to local MySQL server through socket的解决方法

    启动Mysql服务常会提示下面错误: ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/ ...

  7. .NET(C#):await返回Task的async方法

    众所周知,async方法只可以返回void,Task和Task<T>. 对于返回void的async方法,它并不是awaitable,所以其他方法不能用await方法来调用它,而返回Tas ...

  8. TPL实现Task.WhileAll扩展方法

    文章翻译整理自 Nikola Malovic 两篇博文: Task.WhileAll Awaitable task progress reporting 当 Task.WhenAll 遇见 Task. ...

  9. Gradle学习系列之二——创建Task的多种方法

    在本系列的上篇文章中,我们讲到了Gradle入门,在本篇文章中我们将讲到创建Task的多种方法. 请通过以下方式下载本系列文章的Github示例代码: git clone https://github ...

随机推荐

  1. 【NOIP2016练习】T1 string (计数)

    题意: 思路: ; ..]of int64; n,k,i:longint; ans,x,y:int64; s,t:ansistring; function c(x,y:longint):int64; ...

  2. py2exe使用方法 (含一些调试技巧,如压缩email 类)

    http://justcoding.iteye.com/blog/900993 一.简介 py2exe是一个将python脚本转换成windows上的可独立执行的可执行程序(*.exe)的工具,这样, ...

  3. python,django,mysql学习之环境安装配置

    参考:https://docs.djangoproject.com/en/1.6/intro/tutorial01/ http://rainyang.blog.51cto.com/469543/115 ...

  4. 本地hosts文件

    (1)什么是Hosts文件? Hosts是一个没有扩展名的系统文件,可以用记事本等工具打开,其作用就是将一些常用的网址域名与其对应的IP地址建立一个关联“数据库”,当用户在浏览器中输入一个需要登录的网 ...

  5. HDU 5046 Airport【DLX重复覆盖】

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5046 题意: 给定n个城市的坐标,要在城市中建k个飞机场,使城市距离最近的飞机场的最长距离最小,求这 ...

  6. Codeforces 536C Tavas and Pashmaks(凸壳)

    题目链接 Tavas and Pashmaks 题目大意:n个人比赛,游泳和赛跑,游泳距离S,赛跑R.每个人对应两个速度(陆地和水上的),如果存在S,R,使得第i个人胜利,那么输出i 题目要求输出所有 ...

  7. java反射原理运用

    1.首先用Java反射机制的要做到的一个目的:我们都知道通过得到一个对象中的指定方法或者属性等,基于这个原理我们来做一个 通用的功能,让客户端可以通过传入的对象和一个标识去调用这个对象里自己想要的方法 ...

  8. Oracle if else 、case when 判断示例

    declare -- 声明奖金的变量 v_comm emp.comm%type; begin -- 查询出员工的奖金 select comm into v_comm from emp where em ...

  9. 类加载器在加载类 的时候就已经对类的static代码块和static变量进行了初始化

    类装载器ClassLoader 类装载器工作机制 类装载器就是寻找类的节码文件并构造出类在JVM内部表示对象的组件.在Java中,类装载器把一个类装入JVM中,要经过以下步骤: [1.]装载:查找和导 ...

  10. python--文本处理1

    1.字符和字符值之间的转换 内建函数:ord(),chr() >>> print ord("a") 97 >>> print chr(97) a ...