boost Signals 库实现的是一个subscriber模式.
所有subscribers 向 Signal 对象注册其自身,当Signals的 sig()函数被调用时,所有注册了的subscribers的函数会被依次调用。
所以Signals是非常简单的。
名词的含义:
Signal:表示一个事件,或则触发条件。
sig(): signaling
slot: 计算机的扩展卡插槽,在Signals库中表示subscriber,意为subscribers可以任意增加,侧重可扩展性.
例子:
struct HelloWorld { void operator()() const { std::cout << "Hello, World!" << std::endl; } }; // ... // Signal with no arguments and a void return value boost::signal<void ()> sig; // Connect a HelloWorld slot HelloWorld hello; sig.connect(hello); // Call all of the slots sig();
Advanced sample:
float product(float x, float y) { return x*y; } float quotient(float x, float y) { return x/y; } float sum(float x, float y) { return x+y; } float difference(float x, float y) { return x-y; } boost::signal<float (float x, float y)> sig; sig.connect(&product); sig.connect("ient); sig.connect(&sum); sig.connect(&difference); std::cout << sig(5, 3) << std::endl;
signal is a tempate class which enables you define your own callback type, in this sample, user provide a function as callback.
connect(): Subscriber向Signals对象注册其自身。
connect()函数的返回值是一个boost::signals::connection 类型的对象,该对象有如下方法:
block()/unblock() 表示该slot暂时不被signal的sig()函数调用,但并不表示disconnect.
connect()函数的返回值也可以是一个boost::signals::scoped_connection类型的对象,该对象在离开其作用域时会自动disconnect.
signals同样有一个disconnect函数,它的参数是subscriber, 看例子:
void foo(); void bar(); signal<void()> sig; sig.connect(&foo); sig.connect(&bar); // disconnects foo, but not bar sig.disconnect(&foo);
能够自动disconnect的slot:
struct NewsMessageArea : public MessageArea, public boost::signals::trackable
{
// ...
};
当NewsMessageArea 类型的对象被销毁时,会自动调用disconnect函数解除signal/slot的connection。
signal/slot 的关系在哪些情况下会解除?
1. signal或slot对象显式地调用disconnect函数
2. trackable的slot被销毁时
3. signal被销毁时
一个signal对象可以是另一个signal对象的slot,从而实现了级联的signal/slot关系。
浙公网安备 33010602011771号