文档章节

21_BasicTaskScheduler基本任务调度器(一)——Live555源码阅读(一)任务调

乌合之众
 乌合之众
发布于 2015/06/16 09:01
字数 874
阅读 27
收藏 0

#21_BasicTaskScheduler基本任务调度器(一)——Live555源码阅读(一)任务调度相关类

[TOC]

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

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

##BasicTaskScheduler基本任务调度器

BasicTaskScheduler很重要了,有了前面的铺垫,这个不会很难。 这个类的重点在于BasicTaskScheduler::SingleStep方法的实现。弄懂了这个,基于事件处理模型也就差不多弄懂了。 这里添加了四个数据成员,是用来select模型的。关于select模型,这里不解释了。在windows和unix/linux等平台都有相关的API,实现有点差别,但是原理是一致的。

	int fMaxNumSockets;		//最大的socket数,select调用时提高效率
	fd_set fReadSet;		//监控读操作的集合
	fd_set fWriteSet;		//监控写操作的集合
	fd_set fExceptionSet;	//监控有异常的集合

BasicTaskScheduler基本任务调度器

BasicTaskScheduler基本任务调度器

##BasicTaskScheduler基本任务调度器的定义

class BasicTaskScheduler : public BasicTaskScheduler0 {
public:
	static BasicTaskScheduler* createNew();
	virtual ~BasicTaskScheduler();

protected:
	BasicTaskScheduler();
	// called only by "createNew()"

protected:
	// Redefined virtual functions:

	/*
	*    设置select的超时时间为maxDelayTime(<=0 或大于一百万秒 时1百万秒)
	*    调用int selectResult = select(fMaxNumSockets, &readSet, &writeSet, &exceptionSet, &tv_timeToDelay);
	*    如果select出错返回,打印出错信息,并调用 internalError函数
	*    从处理程序描述链表中查找fLastHandledSocketNum代表的 处理程序描述对象指针,如果没找到,就在后面的while的时候从链表的头开始,否则从找到的位置开始
	*    从链表中取出处理程序描述节点对象,并调用其内部保存的处理程序
	*    设置fTriggersAwaitingHandling
	*    调用fDelayQueue.handleAlarm();
	*/
	virtual void SingleStep(unsigned maxDelayTime);
	// 添加到后台处理
	virtual void setBackgroundHandling(int socketNum, int conditionSet, BackgroundHandlerProc* handlerProc, void* clientData);
	// 从后台处理移出
	virtual void moveSocketHandling(int oldSocketNum, int newSocketNum);

protected:
	// To implement background operations: 实施后台操作
	int fMaxNumSockets;		//最大的socket数,select调用时提高效率
	fd_set fReadSet;		//监控读操作的集合
	fd_set fWriteSet;		//监控写操作的集合
	fd_set fExceptionSet;	//监控有异常的集合
};

##BasicTaskScheduler的构造与析构

BasicTaskScheduler的构造函数是protected权限的,其只在静态方法createNew中被调用。 创建的时候清零了四个成员,并调用了schedulerTickTask(this)

BasicTaskScheduler::BasicTaskScheduler()
: fMaxNumSockets(0) {
	FD_ZERO(&fReadSet);
	FD_ZERO(&fWriteSet);
	FD_ZERO(&fExceptionSet);

	schedulerTickTask(this); // ensures that we handle events frequently
}

###下面来介绍一下schedulerTickTask函数(调度滴答任务)

这个函数的作用就是将其参数转为(BasicTaskScheduler*)类型,然后调用scheduleDelayedTask来调度(创建)一个延时任务。有意思的是,这个延时任务程序就是这个函数自身,延时任务程序的参数也是其参数。延时时间是10毫秒。 这有点像是函数递归调用了。与之不同的是,如果不去调度任务,递归就是无效的。

#define MAX_SCHEDULER_GRANULARITY 10000 // 10 microseconds: We will return to the event loop at least this often
static void schedulerTickTask(void* clientData) {
	((BasicTaskScheduler*)clientData)->scheduleDelayedTask(MAX_SCHEDULER_GRANULARITY, schedulerTickTask, clientData);
}

析构函数是空的,就不说了。只要知道,在析构的时候会调用基类的析构函数。


© 著作权归作者所有

乌合之众
粉丝 13
博文 90
码字总数 79438
作品 1
海淀
程序员
私信 提问
Live555学习基础类

Live555主要用到的类介绍: 1.UsageEnvironment类:抽象基类 class UsageEnvironment {public:void reclaim(); TaskScheduler& taskScheduler() const {return fScheduler;}//返回TaskSched......

rootusers
2015/01/08
0
0
RTSP学习笔记(1)live555

1、UsageEnvironment UsageEnvironment代表了整个程序的运行环境,其中保存了一些全局变量,定义了一些输出函数(纯虚函数)。从这些输出函数就可以看出该类主要用于充当程序的全局上下文,并...

Sean-x
2016/02/23
53
0
react fiber 主流程及功能模块梳理

由于有裁员消息流出+被打C的双重冲击,只好尽量在被裁之前恶补一波自己的未知领域,随时做好准备 本文是自己在阅读完react fiber的主流程及部分功能模块的一篇个人总结,有些措辞、理解上难免...

xilixjd
02/25
0
0
基于Mesos的作业云 Elastic-Job-Cloud 源码分析 —— 作业调度(一)

本文基于 Elastic-Job V2.1.5 版本分享 Elastic-Job-Cloud 源码分析系列(6篇)传送门 1. 概述 2. 作业执行类型 3. Producer 发布任务 3.1 常驻作业 3.2 瞬时作业 3.3 小结 4. TaskLaunchSch...

芋道源码掘金Java群217878901
2017/09/07
0
0
大数据学习之路(持续更新中...)

在16年8月份至今,一直在努力学习大数据大数据相关的技术,很想了解众多老司机的学习历程。因为大数据涉及的技术很广需要了解的东西也很多,会让很多新手望而却步。所以,我就在自己学习的过...

青夜之衫
2017/12/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

浅谈跨平台框架Flutter的搭建与运行

作者:个推iOS开发工程师 伊泽瑞尔 Flutter是Google推出的跨平台的解决方案,用以帮助开发者在 Android 和 iOS 两个平台开发高质量原生应用的全新移动 UI 框架。 之前我们为大家介绍了《跨平...

个推
10分钟前
0
0
Spring Boot 面试,一个问题就被干趴下了!

最近LZ面试了不少人,其中不乏说对 Spring Boot 非常熟悉的,然后当我问到一些 Spring Boot 核心功能和原理的时候,没人能说得上来,或者说不到点上,可以说一个问题就问趴下了! 这是我的问...

Java领航员
11分钟前
0
0
U72024 C++初识类

题目 (Circle类)一个圆形的旱冰场地,场地内抹水泥,造价为每平方米20元,围栏用木条围成,每米造价35元。设计一个Circle类,可以求出圆的面积和边长,用户可以此求出旱冰场的造价。请在下...

StupidZhe
今天
9
0
你应该选择哪种树莓派?

本文是《14 天学会树莓派使用》系列文章的第一篇。虽然本系列文章主要面向没有使用过树莓派或 Linux 或没有编程经验的人群,但是肯定有些东西还是需要有经验的读者的,我希望这些读者能够留下...

linux-tao
今天
2
0
动态代理知识详解

动态代理实现的两种方式 给动态代理举个栗子:例如我们平时买笔记本电脑,很多时候都是不从厂家拿货,而是通过经销商买电脑。代理模式出现解决了生产厂家的一些问题,那么这个这个思想在我们...

我叫小糖主
今天
12
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部