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的标记位显示是否处于关联状态。

参考

Caused by: java.lang.ClassNotFoundException: com.ctrip.framework.apollo.openapi.client.ApolloOpenApiClient是一个Java的异常信息,表示在程序运行过程中找不到com.ctrip.framework.apollo.openapi.client.ApolloOpenApiClient类。这个异常通常发生在程序尝试加载某个类的时候,但是无法找到该类的定义。这个异常可能是由于类路径配置问题导致的,即程序无法找到相关的类文件。要解决这个异常,可以尝试以下几个方法: 1. 确保相关的依赖库已经正确添加到项目中。检查项目的构建配置文件,例如Gradle或Maven配置文件,确保相关的依赖库已经正确地添加到项目的依赖中。 2. 检查类路径配置。确保程序的类路径配置正确无误,以便程序能够找到所需的类文件。可以检查环境变量或类加载器的配置,确保程序能够正确加载所需的类。 3. 检查类文件是否存在。确认com.ctrip.framework.apollo.openapi.client.ApolloOpenApiClient类文件存在于项目的类路径中。如果文件不存在或者路径配置错误,程序将无法找到该类。 4. 检查类的命名空间。确保类的命名空间(package)与类文件所在的目录结构相匹配。如果命名空间与目录结构不匹配,程序也无法正确加载相关的类文件。 通过检查以上几个方面,你可以尝试解决Caused by: java.lang.ClassNotFoundException: com.ctrip.framework.apollo.openapi.client.ApolloOpenApiClient异常。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [报错解决:gradle逆向工程出现Caused by: java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver](https://blog.csdn.net/qyb19970829/article/details/111055162)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [Android Caused by: java.lang.ClassNotFoundException解决办法](https://download.csdn.net/download/weixin_38703295/12784351)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值