我是靠谱客的博主 简单薯片,最近开发中收集的这篇文章主要介绍webrtc sigslot 使用以及源码分析背景connectemit释放类图联系,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

背景

在使用webrtc的时候,我们会看到使用sigslot,那什么是sigslot就是我们所说的信号与槽, qt使用的。 webrtc中的Sigslot 是Sarah Thompson 设计实现的C++ 事件处理的框架,这套框架非常轻量级,全部代码只有一个sigslot.h 文件,其设计也非常出色,最大限度的将事件和处理机制解耦, 并且保证了线程安全.
在WebRTC中, sigslot是其基础的事件处理框架,在多个模块的消息通知, 响应处理中被使用.

connect

在整个头文件中, 对于槽主要要继承has_slots这个类, has_slots这个类主要是保存了所有的信号,发送者集合signal集合

当signal调用connect的时候, slots会保存它的信号

swh.clicked.connect(&lit1, &Light::turn_on);

调用signal的connect, 然后调用signal_connect方法保存信号


template<class desttype>
void connect(desttype* pclass, void (desttype::*pmemfun)())
{
lock_block<mt_policy> lock(this);
_connection0<desttype, mt_policy>* conn =
new _connection0<desttype, mt_policy>(pclass, pmemfun);//创建一个connect对象
m_connected_slots.push_back(conn); //放入connect列表
//调用对象的signal_connect函数,而该对象必须继承自has_slots
//has_slots函数
pclass->signal_connect(this); //将this-signal插入到对象的sender集合中
}

_connection0 这个没有参数列表, 代码当中_connection1~_connection8都是对应的几个参数, 这个和
signal1~signal8 是一样的。 这里的new _connection0 就是保存了槽的类地址和类方法的地址, 这里要有注意
- 返回值必须为void
- Slot参数个数范围为0-8个
- 实现slot的类必须继承自has_slots<>

m_connected_slots 存储这个所有的槽

emit

当信号触发的时候,这里有两种调用的方法:

swh.clicked();
swh.clicked.emit();
  • 第一种我们是默认调用它的对用的operator重载的
  • 第二种调用的emit方法
lock_block<mt_policy> lock(this);
typename connections_list::const_iterator itNext, it = m_connected_slots.begin();
typename connections_list::const_iterator itEnd = m_connected_slots.end();
while(it != itEnd)
{
itNext = it;
++itNext;
//调用connect0的emit
(*it)->emit();
it = itNext;
}

这里就是connect传进来的m_pobject 和 m_pmemfun

//发送消息,即调用connect中注册的回调函数(对象的成员函数)
virtual void emit()
{
(m_pobject->*m_pmemfun)();
}

释放

当程序结束时, 由于signal信号继承_signal_base0~_signal_base8, 在这里析构的时候会disconnect_all方法

lock_block<mt_policy> lock(this);
typename connections_list::const_iterator it = m_connected_slots.begin();
typename connections_list::const_iterator itEnd = m_connected_slots.end();
while(it != itEnd)
{
//依次遍历connection 的list, 调用has_slots的signal_disconnect
(*it)->getdest()->signal_disconnect(this);
//删除connections
delete *it;
++it;
}
//删除list当中的所有元素
m_connected_slots.erase(m_connected_slots.begin(), m_connected_slots.end());

类图

image

联系

webrtc分享学习与研究qq群 438078394

作者: clzhan 690759587

最后

以上就是简单薯片为你收集整理的webrtc sigslot 使用以及源码分析背景connectemit释放类图联系的全部内容,希望文章能够帮你解决webrtc sigslot 使用以及源码分析背景connectemit释放类图联系所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(67)

评论列表共有 0 条评论

立即
投稿
返回
顶部