live555四大基础组件学习笔记-处理程序handler类

【live555双链表】HandlerSet 管理一个handler的双向链表 HandlerSet handlerset的核心是拥有一个handlerdescritpion的双联表 双链表对象 叫做handler handler是跟进socknum来找到的 里面保存 int socketNum, int conditionSet, TaskScheduler::BackgroundHandlerProc* handlerProc, void* clientData /Users/zhangbin/myProjects/newSVN/PRIVATE-QUIC/quicpushe 阅读详情

1.介绍

  处理程序相关类一共有三个,其没有派生继承关系,但是其有友元关系和使用关系。处理程序相关类主要是用于对相关的处理函数的指针和数据的包装,方便在DelayQueue相关类中的使用等。
先来总的说以下三个类的关系。

  HandlerDescriptor是一个节点类,而HandlerSet是一个链表类,链表节点就是HandlerDescriptor对象。HandlerIterator是一个迭代器类,其绑定一个HandlerSet对象。

  处理程序相关的三个类都定义在live555sourcecontrol\BasicUsageEnvironment\include\HandlerSet.hh文件中。

1.1. HandlerDescriptor

// 处理程序描述类(作为链表的节点)
//构造和析构都是private权限的,因为只能在其友元类HandlerSet中来调用
// 如果nextHandler为其自身,自身就是双向链表的头结点
// 否则将自身插入到nextHandler和nextHandler->fPrevHandler之间
class HandlerDescriptor {
  HandlerDescriptor(HandlerDescriptor* nextHandler);
  virtual ~HandlerDescriptor();// 将自身从双向链表中移除。这个函数一般由delete操作来调用

public:
  int socketNum;        //socket在链表里面用来标识节点
  int conditionSet;     //条件集合
  TaskScheduler::BackgroundHandlerProc* handlerProc; //相应函数指针
  void* clientData; //相应函数参数

private:
  // Descriptors are linked together in a doubly-linked list:
  friend class HandlerSet;
  friend class HandlerIterator;
  HandlerDescriptor* fNextHandler;/下一个处理程序描述
  HandlerDescriptor* fPrevHandler;/上一个处理程序描述
};
  • HandlerDescriptor构造函数

      从其构造函数可以看出,其默认只被用于链表中作为节点存在。并且这个构造函数是private权限的,只有在本类或者友元类中可以使用其来构造对象。
HandlerDescriptor::HandlerDescriptor(HandlerDescriptor* nextHandler)
  : conditionSet(0), handlerProc(NULL) {
  // Link this descriptor into a doubly-linked list:
  if (nextHandler == this) { // initialization
    fNextHandler = fPrevHandler = this;
  } else {
    fNextHandler = nextHandler;
    fPrevHandler = nextHandler->fPrevHandler;
    nextHandler->fPrevHandler = this;
    fPrevHandler->fNextHandler = this;
  }
}
  • HandlerDescriptor析构函数

      从其析构函数可以看出,并不仅仅是将自身释放,而且将节点从链表中移除了。
HandlerDescriptor::~HandlerDescriptor() {
  // Unlink this descriptor from a doubly-linked list:
  fNextHandler->fPrevHandler = fPrevHandler;
  fPrevHandler->fNextHandler = fNextHandler;
}

1.2. HandlerSet


  双向循环链表,HandlerSet类只有一个数据成员,就是HandlerDescriptor fHandlers;这是作为链表的头结点而存在的。

class HandlerSet {
public:
  HandlerSet();//设置fHandlers的下一个和上一个指向fHandler自己
  virtual ~HandlerSet();//逐个释放链表节点 
    // 从链表中查找socketNum代表的HandlerDescriptor,如果没有找到就创建一个并加入到链表
  void assignHandler(int socketNum, int conditionSet, TaskScheduler::BackgroundHandlerProc* handlerProc, void* clientData);
  //从链表中查找socketNum对应的HandlerDescriptor,找到了就delete
  void clearHandler(int socketNum);
  // 从链表中查找oldSocketNum代表的HandlerDescriptor,找到了就将其sockerNum成员替换为newSocketNum
  void moveHandler(int oldSocketNum, int newSocketNum);

private:
    // 从链表中查找socketNum代表的HandlerDescriptor,没找到返回NULL
  HandlerDescriptor* lookupHandler(int socketNum);

private:
  friend class HandlerIterator;
  HandlerDescriptor fHandlers;
};

1.3. HandlerIterator


  HandlerIterator是一个迭代器类,其有两个数据成员,分别是HandlerSet类对象的引用fOurSet,以及一个HandlerDescriptor对象指针fNextPtr。并且HandlerIterator同时是节点和链表的友元类。
fOurSet是一个引用,就说明了HandlerIterator的初始化必须要绑定一个HandlerSet对象。而HandlerSet类的对象又是一个链表,其节点是HandlerDescriptor对象。迭代器对象仅在HandlerSet类中使用。
迭代器构造的时候,会将其fNextPtr指向链表的头节点的下一个。

class HandlerIterator {
public:
  HandlerIterator(HandlerSet& handlerSet);
  virtual ~HandlerIterator();

  HandlerDescriptor* next(); // 返回fNextPtr,并将fNextPtr指向下一个处理程序描述对象
  void reset();//将 fNextPtr 指向链表的头结点的下一个

private:
  HandlerSet& fOurSet;
  HandlerDescriptor* fNextPtr;
};
从零搭建私有AI工作站:Ollama+DeepSeek+Dify本地化部署全攻略 本文提供了一份详尽的本地化AI工作站搭建指南,核心在于实现数据安全与离线可用。通过整合Ollama、DeepSeek与Dify三大工具,手把手教你完成从环境配置、模型部署到可视化应用构建的全过程,重点解决了Dify连接Ollama等关键步骤,助你打造一个完全自主可控的私有AI开发环境。 阅读详情

相关推荐

【医学影像】超声(UltraSound)影像的增强与目标检测

文章目录1 综述1.1 超声发展简史1.2 超声类型2 超声影像的去噪与增强2.1 各向异性扩散去噪模型2.2 色彩恢复的视网膜增强算法SSR和MSR2.3 MSRCR增强算法(基于MSR算法改进版)2.4 参考文献3 超声影像的目标识别3.1 基于跨模态数据迁移进行DL训练3.2 参考文献 1 综述 因工作需要,最近调研了超声(UltraSound)影像的相关知识,包含超声类型、超声影像的去噪和增强,目标检测等,并对相关资料文献进行梳理整合。 本人另外一篇博文主要讲了UltraSound 影像与CT/MR

muyijames的博客 1万+

[live555] 谈一谈 HandlerIterator \ HandlerDescriptor \HandlerSet 构成迭代器

前因 在 创建 live555 服务的时候 TaskScheduler* scheduler = BasicTaskScheduler::createNew(); UsageEnvironment* env = BasicUsageEnvironment::createNew(*scheduler); 会创建 BasicTaskScheduler0::BasicTaskSche...

贱贱的杨 blog 656

在 Mac OS 上编译 WebRTC 教程

在 Mac OS 上编译 WebRTC 教程

iShare_Carlos的博客 1248

5 HandlerIterator处理程序迭代器类——Live555源码阅读(一)基本组件类

这是Live555源码阅读的第一部分,包括了时间类,延时队列类,处理程序描述类,哈希表类这四个大类。 本文由乌合之众 lym瞎编,欢迎转载 my.oschina.net/oloroso HandlerIterator处理程序迭代器类 这里本应该先介绍HandlerDescriptor类的,因为这个类与它的关联比较大,就先介绍这个类。 HandlerIterator是一个迭代器类,其有两个数据成员,...

weixin_34150830的博客 151

HAL库STM32CubeMX+DHT11温湿度传感器模块化驱动与OLED显示实战

本文详细介绍了基于HAL库和STM32CubeMX开发DHT11温湿度传感器模块化驱动的实战过程。通过精确的时序控制和模块化封装,实现了传感器数据采集,并结合OLED显示模块实时展示温湿度信息,为嵌入式开发者提供了完整的解决方案。

h6j7k8l9p0的博客 1131

如何在SendWS实现WhatsApp批量群发设置管理?WhatsApp群发超链有什么好处?

WhatsApp群发顾名思义就是对WhatsApp上的用户好友进行群发消息,给他们群发想要发送的消息。及时不认识对方也可以对他进行群发超链。越来越多做跨境出海运营的工作者利用WhatsApp进行营销推广,因为他能做到低成本高回报,向客户发送消息曝光自己的品牌或产品,使得更多人了解,拓展新客户,提高成交率。

SendWS-WS云控群控拓客聊天翻译 1169

通俗易懂的handler原理解析

先来说一下流程 1、ActivityThread中通过Looper.prepareMainLooper() 创建looper对象 1)在Looper.prepareMainLooper() 方法中,如果有Looper实例会报错,所以一个线程中只能有一个Looper实例 2)在Looper.java类中直接创建sThreadLocal,ThreadLocal是一个线程内部的存储类,可以在指定线程内存储数据,数据存储以后,只有指定线程可以得到存储数据 3)通过下图也可以看出ThreadLocal也是只能有一

weixin_43841938的博客 659

OpenAI Error: 403 Country, region, or territory not supported [Python]

从OpenAI的API服务中获取数据时,由于你所在的国家、地区或领土不被支持,因此请求被拒绝了

suiusoar 5659

golang设计模式---责任链模式

设计模式-责任链模式

IT艺术家-rookie的博客 977

AttributeError: module ‘lib‘ has no attribute ‘X509_V_FLAG_CB_ISSUER_CHECK‘解决方案

本文主要介绍了AttributeError: module ‘lib’ has no attribute 'X509_V_FLAG_CB_ISSUER_CHECK’解决方案,希望能对使用python的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 5万+

OceanBase迁移平台OMS企业版部署

OceanBase迁移平台OMS企业版部署摘要: 本文档详细介绍了OceanBase迁移平台OMS企业版的部署流程,包含环境准备、OAT部署管理、MetaDB部署等关键步骤。

Sebastien23的博客 517

Android设计模式—责任链模式

1.责任链模式 责任链模式是指将一个请求从链式的首端发出,沿着链的路径依次传递给每个节点对象,直到有对象处理这个请求为止,使多个对象都有机会处理请求,从而避免了请求发送者与接收者之间的耦合关系,使编程更有灵活性。 责任链模式是一种对象的行为模式。 责任链模式允许开发者通过处理者链进行顺序发送,每个链节点在收到请求后,具备两种能力:对其进行处理(消费)或将其传递给链的下个处理者。当你想要让一个以上的对象有机会能处理某个请求时,就可以使用责任链模式。通过责任链模式,为某个请求创建一个对象链,每个对象链依序

zenmela2011的专栏 1652

自建 HTML获取腾讯六宫格点选图片验证码素材,实现刷新批量获取图片方便训练

通过自建 HTML 页面,可以方便地获取腾讯六宫格二维码素材,不仅过程简单,而且可以灵活配置各种参数。希望这篇文章能帮助到需要相关素材的小伙伴。如果你有其他问题或者更好的方法,欢迎留言交流!

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 483

live555 Handler调用函数顺序

fHandler调用顺序: 1、RTSPClient----------->ConnectionHandler 2、RTSPClient----------->IncomingDataHandler 3、RTCPInstance------->IncomingReportHandler 4、MultiFramedRTPSource----->networkReadHandl...

NBA_1的博客 362

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

live555 client 接收rtp数据

转自https://blog.youkuaiyun.com/freezlz/article/details/21044315 2014-03-08  22:05:58 描述live555 client即openRTSP的流程,简单点说,playCommon.cpp,流为h264和g726。在实际项目中已成功应用。 以下为我所见所得,有错误之处请指正,谢谢! 1、live555的三种任务 s...

NBA_1的博客 685

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

二、Live555 基础类

二  基础类  讲几个重要的基础类:  BasicUsageEnvironment 和 UsageEnvironment 中的类都是用于整个系统的基础功能类.比 如 UsageEnvironment 代表了整个系统运行的环境,它提供了错误记录和错误报告的功能, 无论哪一个类要输出错误,就需要保存 UsageEnvironment 的指针.而 TaskScheduler 则提供了任务调度功能

IT Zk 584

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Live555-基类研究二

TaskSecheduler类是一个任务调度器,它是整个Live555的任务调度中心,程序在任何时刻的任何动作,均由该类完成。其核心函数是SingleStep。Live555的任务主要分为Delayed Event、Socket Event以及Trigger Event。其类层次结构如下图所示:   从类图中可以看到,其类层次结构和第二节中的UsageEnvironment类极其相

BIGBurning 2271

4 Handler相关类——Live555源码阅读(一)基本组件类

这是Live555源码阅读的第一部分,包括了时间类,延时队列类,处理程序描述类,哈希表类这四个大类。 Handler相关类概述 处理程序相关类一共有三个,其没有派生继承关系,但是其有友元关系和使用关系。处理程序相关类主要是用于对相关的处理函数的指针和数据的包装,方便在DelayQueue相关类中的使用等。 先来总的说以下三个类的关系。 HandlerDescriptor是一个节点类,而Handle...

weixin_34067980的博客 118

7 HandlerSet 处理程序链表类——Live555源码阅读(一)基本组件类

这是Live555源码阅读的第一部分,包括了时间类,延时队列类,处理程序描述类,哈希表类这四个大类。 本文由乌合之众 lym瞎编,欢迎转载 my.oschina.net/oloroso HandlerSet 处理程序链表类 这里使用的Set这个单词,Set是集合的意思,这里实质上是一个双向循环链表。这个类比较重要,这里会详细的介绍。 HandlerSet类只有一个数据成员,就是HandlerDes...

weixin_33794672的博客 142

live555学习笔记2-基础类

二 基础类 讲几个重要的基础类: BasicUsageEnvironment和UsageEnvironment中的类都是用于整个系统的基础功能类.比如UsageEnvironment代表了整个系统运行的环境,它提供了错误记录和错误报告的功能,无论哪一个类要输出错误,就需要保存UsageEnvironment的指针.而TaskScheduler则提供了任务调度功能.整个程序的运行发动机就是它,它

多媒体编程、网络编程、系统编程、网络安全编程、驱动编程 856

Live555学习之Socket事件处理

live555流媒体服务器初始化 RTSPServer* rtspServer; portNumBits rtspServerPortNum = 554; //创建rtsp服务器,设置端口号和传入环境 rtspServer = DynamicRTSPServer::createNew(*env, rtspServerPortNum, authDB);

建建的博客 1372

live555源码学习笔记之TaskScheduler

今天抽空研究了下live555的任务实现: TaskScheduler分为三种任务:socket handler,event handler,delay task。这三种任务的特点是,前两个加入执行队列后会一直存在,而delay task在执行完一次后会立即弃掉。 socket handler保存在队列BasicTaskScheduler0::HandlerSet* fHandlers中;

莫问收获、敢问耕耘 1766
上一篇: AVI格式--学习笔记
下一篇: live555学习笔记之-GroupSock(NetAddress&NetAddressList&AddressPortLookupTable)
BERLIN23
博客等级 码龄14年 7粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值