Apollo:源码分析之signal.h

理论

在这里插入图片描述

  • 当对象的内部状态以某种可能使对象的客户端或者所有感兴趣的方式改变时,该对象就会发出信号。
  • 发出信号后,与其连接的插槽通常会立即执行,就像正常的函数调用一样。

槽:Slot

文件:cyber/base/signal.h

从这个类可以学到变参是怎么写的
在这里插入图片描述

有两个成员变量

数据类型变量名说明
Callbackcb_;函数指针,在构造函数中指令
boolconnected_ = true;在构造函数中指定,槽有一个开关,决定信号是否可以连接到这里

关键函数:关键自傲与重写了operator(),如果满足要求,那么调用了Slot(…)之后就会自动调用构造函数中注册的回调函数

在这里插入图片描述

除此之外,还可以看下它的构造是怎么样的:

在这里插入图片描述
另外,还提供了两个操作函数:

在这里插入图片描述
可以在cyber/base/signal_test.cc中学到这个类应该怎么用:

在这里插入图片描述
在这里插入图片描述
小结:它其实就保存了一个回调函数std::function<void(Args…)> cb_和一个标记bool connected_,提供一个Disconnect函数用来将标记置为false。它也和信号一样重载了()操作符,当被调用时就会去运行cb_函数。

信号:Signal

我们先来看下它是怎么用的。

在这里插入图片描述
首先,一个信号可以连接多个槽函数。这从它的成员变量中也可以体现出来:
在这里插入图片描述
成员变量: slots记录了管理到该信号下的所有槽

Signal中的函数都是线程安全的。

operator()

然后它还重载了operator()函数,它会调用关联到这个信号对应的所有槽(所有关联的回调函数),其实就是通知所有监听该信号的回调函数

可以看到具体的动作就是slot的operator()来做的

在这里插入图片描述
在这里插入图片描述

Connect(const Callback& cb)

作用:

  • 根据指定回调函数创建一个slot,然后加入到自己的关联槽列表
  • 然后使用slot和signal创建了一根管子
    在这里插入图片描述
    在这里插入图片描述
    可以看到它只是构造了一根管子

Disconnect(const ConnectionType& conn)

  • 接收一个Connection参数,从槽列表中找到该槽,然后将槽的标记置为false并从列表中删除。
  • 删除动作是由槽函数的Disconnect()来做的

在这里插入图片描述

关联:Connection

它的成员变量如下:
在这里插入图片描述

可以看到,connection相当于一根管子,管子两端分别是slot和signal。
在这里插入图片描述

成员函数

HasSlot

在这里插入图片描述
从上面我们可以推断出两个关键点:

  • slot和slot_均不能为null,只要有一个为null或者全部为null,那么直接返回false
  • HasSlot比较的是slot和slot_的地址
IsConnected()

在这里插入图片描述
在这里插入图片描述

这根管子是不是通的,由槽来决定

Disconnect

在这里插入图片描述

connect的断开动作是调用信号signal_的Disconnect实现的

在这里插入图片描述

如果signal_确实是使用了当前conn关联了slot,那么调用slot的Disconnect
在这里插入图片描述
这样就不会调用到slot绑定的那个回调函数了。

小结:保存了一个信号的指针一个槽的指针,一个Connection实例就代表了一条关联关系。通过Slot的标记位显示是否处于关联状态。

参考

Apollo:源码分析之signal.h_signal.h 详解-优快云博客

### 验证 `aem` 命令是否正确安装 为了验证 `aem` 命令是否已成功安装,可以尝试在终端中运行以下命令: ```bash aem --help ``` 如果该命令返回有关 `aem` 工具的功能描述及其可用选项,则表明它已被正确安装[^1]。此命令通常会显示工具支持的所有参数、子命令以及它们的作用。 对于 Adobe AEM Synchronization Tool (`aemsync`) 而言,其核心功能在于同步本地环境与远程服务器之间的内容。具体来说,它可以处理诸如页面、资产或其他资源类型的上传或下载操作。这些行为由命令行中的特定标志控制,例如 `-u` 表示上传而 `-d` 则表示下载等。 另外,在某些情况下,可以通过检查路径变量 `$PATH` 来进一步确认是否存在指向 `aem` 执行文件的有效链接。这可通过下面这条指令完成: ```bash which aem ``` 上述命令将打印出程序的实际存储位置;如果没有找到任何匹配项,则意味着尚未将其加入全局访问范围之内[^3]。 最后,关于理解某个新装设的应用所提供的全部特性方面,除了查阅官方手册外,还可以利用内置的帮助机制获取即时指导信息。比如针对不同的动作模式分别调用相应的辅助提示语句如下所示: - 查看通用指南: ```bash aem help ``` - 获取指定子命令详情(假设这里以 push 动作为例): ```bash aem push -h ``` 以上方式均有助于快速掌握目标软件的核心能力集。 #### 如何检验 JSON 文件格式合法性? 虽然这不是直接关联于提问的主题,但既然提到了 JSON 数据校验技术,不妨简单提及一下相关内容以便参考学习之用。假如需要判断某份扩展名为 .json 的文档内部结构是否遵循标准规范的话,那么借助专门设计为此目的服务的小型实用程序——JsonLint 就显得非常方便快捷了。只需按照下述模板执行相应测试即可得出结论: ```bash jsonlint yourfile.json ``` 一旦发现存在不符合规定的部分,系统便会立即反馈错误定位及相关修正建议给用户知道[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值