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等类的实现方式!
获取更多信息
Copyright © EasyDarwin.org 2013-2016

EasyDarwin Streaming Server对Task的调用方法的更多相关文章
- Darwin Streaming server 的 Task 类
Darwin Streaming Server 是一个开放源代码的streaming server,对于streaming server的编程和软件结构有着一定的参考价值,它是使用C++写的,其中的并 ...
- Django在不启动server的情况下调用方法
from django.conf import settingsfrom django import template settings.configure() a = template.Templa ...
- Darwin Streaming Server 简介
Darwin Streaming Server 概要 Darwin Streaming Server简称DSS.DSS是Apple公司提供的开源实时流媒体播放服务器程序.整个程序使用C++编写 ...
- Darwin Streaming Server 核心代码分析
基本概念 首先,我针对的代码是Darwin Streaming Server 6.0.3未经任何改动的版本. Darwin Streaming Server从设计模式上看,采用了Reactor的并发服 ...
- 连接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 ...
- 启动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/ ...
- .NET(C#):await返回Task的async方法
众所周知,async方法只可以返回void,Task和Task<T>. 对于返回void的async方法,它并不是awaitable,所以其他方法不能用await方法来调用它,而返回Tas ...
- TPL实现Task.WhileAll扩展方法
文章翻译整理自 Nikola Malovic 两篇博文: Task.WhileAll Awaitable task progress reporting 当 Task.WhenAll 遇见 Task. ...
- Gradle学习系列之二——创建Task的多种方法
在本系列的上篇文章中,我们讲到了Gradle入门,在本篇文章中我们将讲到创建Task的多种方法. 请通过以下方式下载本系列文章的Github示例代码: git clone https://github ...
随机推荐
- 【CF733F】Drivers Dissatisfaction(最小瓶颈生成树,倍增)
题意:给出一个图,每条边有权值和花费c,每次花费c能使的权值-1.给出一个预算,求减完权值后的一个最小生成树. 思路:感谢CC大神 有这样一个结论:最佳方案里必定存在一种,预算全部花费全部分配在一条边 ...
- net4:GridView中的重要操作(添加checkbox,以及鼠标动作,行颜色等)
原文发布时间为:2008-07-29 -- 来源于本人的百度文章 [由搬家工具导入] using System;using System.Data;using System.Configuration ...
- C语言中的bool类型
C99中提供了一个头文件 <stdbool.h> 定义了bool代表_Bool,true代表1,false代表0.只要导入 stdbool.h ,就能非常方便的操作布尔类型了. 代码如下: ...
- build android on macOS
http://blog.csdn.net/loften_93663469/article/details/51503293 @import url(http://i.cnblogs.com/Load. ...
- Echarts-之显示百分比
对于使用echarts要显示百分比,要改两个地方,第一个地方时坐标轴显示为百分比的格式,第二个是让值以百分比的形式显示,如50,在图上面显示为50%. yAxis: [ { type: 'value' ...
- 1.搭建maven,eclipse创建maven项目
1.下载maven包,下载地址为:http://maven.apache.org/download.cgi 2.解压zip包 3.eclipse 引入maven: window-Preferences ...
- Ext 上传文件
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"/> <title> ...
- BT原理分析(转)
BT种子文件结构分析,参考:http://www.cnblogs.com/EasonJim/p/6601047.html BT下载,参考:http://baike.baidu.com/item/BT下 ...
- Maven的构建/测试/打包
继上一篇http://www.cnblogs.com/EasonJim/p/6809882.html使用Maven创建工程后,接下来是使用Maven进行构建/测试/打包. 在打包之前,先熟悉一下Mav ...
- 给button添加长按手势并侦测到此button
1, 添加手势 self.longPressRecognizer = [[UILongPressGestureRecognizer alloc]initWithTarget:self action:@ ...