知识百科
Signals2是boost里面另一个Signals库,该库实现了线程安全的观察者模式,基于函数回调机制实现信号/槽的绑定和触发事件。引用头文件:#include <boost/signals2.hpp>
说明:该库是线程安全的。
相关:C#语言的event/delegate机制 ;Qt 信号和槽
1. Signals2中连接方式 说明
位置:<boost/signals2/signal.hpp>
// connection management
connection connect(const slot_type&, connect_position = at_back);
connection connect(const group_type&, const slot_type&,
connect_position = at_back);
可以看出有几种连接方式,下面通过代码来说明。
1. 1 connection connect(const slot_type&, connect_position = at_back);
#include <iostream>
#include <boost/bind.hpp>
#include <boost/function.hpp>
#include <boost/signals2.hpp>
using namespace std;
void slots1(){
cout<<"slots1 call"<<endl;
}
void slots2(){
cout<<"slots2 call"<<endl;
}
struct Hello
{
Hello() {}
void operator()()const{
std::cout<< "Hello world!"<<endl;
}
};
int main()
{
boost::signals2::signal<void()> sig1;
sig1.connect(&slots1);
sig1.connect(&slots2);
sig1();
boost::signals2::signal<void()> sig2;
sig2.connect(Hello());
sig2();
return 0;
}
输出结果:
slots1 call
slots2 call
Hello world!
说明:一般调用connect 是采用默认方式connect_position = at_back ;因此执行结果按照connect设置方式顺序执行。
1.2 connection connect(const group_type&, const slot_type&, connect_position = at_back);
#include <iostream>
#include <boost/bind.hpp>
#include <boost/function.hpp>
#include <boost/signals2.hpp>
using namespace std;
template<int N>
struct Slot
{
Slot() {}
void operator ()(){
cout<<"Slot num is : " <<N<<endl;
}
};
int main(){
boost::signals2::signal<void()>sig;
sig.connect(Slot<1>(), boost::signals2::at_back);
sig.connect(Slot<100>(), boost::signals2::at_front);
sig.connect(2, Slot<40>(), boost::signals2::at_back);
sig.connect(2, Slot<50>(), boost::signals2::at_front);
sig.connect(8, Slot<60>());
sig();
}
输出结果:
Slot num is : 100
Slot num is : 50
Slot num is : 40
Slot num is : 60
Slot num is : 1
说明: “未命名”插槽(即,未指定组名称已连接的插槽)可以放置在插槽列表的前面或后面(通过传递boost :: signals2 :: at_front或boost :: signals2 :: at_back as 分别连接的最后一个参数),默认为列表的结尾。 指定组时,最后的at_front或at_back参数描述了插槽在组排序中的位置。 与at_front连接的未分组插槽将始终位于所有分组插槽之前。 与at_back连接的未分组插槽将始终接通所有分组插槽。
2. 返回值处理
#include <iostream>
#include <boost/bind.hpp>
#include <boost/function.hpp>
#include <boost/signals2.hpp>
using namespace std;
template<int M>
struct Slot2
{
Slot2() {}
int operator ()(int n){
cout<<"Slot num is : " <<n<<endl;
return n * M;
}
};
int main(){
boost::signals2::signal<int(int)> sig2;
sig2.connect(Slot2<10>());
sig2.connect(Slot2<100>());
cout<<*sig2(30)<<endl;
}
输出结果:
Slot num is : 30
Slot num is : 30
3000
说明:返回类型的信号(float,即赋值给boost :: signals2 :: signal类模板的第一个模板参数)的默认行为是调用所有插槽然后返回 boost :: optional包含被调用的最后一个槽返回的结果。 结果是连接的最后一个插槽。
延伸:
1.
disconnect 断开一个或者一组信号槽;disconnect_all_slots断开所以信号槽连接
2.Container容器可以接收多个返回值,可以参考以下连接实例
3.scoped_connection 顾名思义只在该声明的作用域内有效,离开后就会断开。
4.
connection是信号和槽连接connect返回的一个句柄。可以用它来判断一些状态等操作。
更多请参考:https://www.boost.org/doc/libs/1_68_0_beta1/doc/html/signals2.html