theEagles

I am sailing, to be with you, to be free.
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

boost::signals库简明手册

Posted on 2012-10-12 15:55  theEagles  阅读(251)  评论(0)    收藏  举报

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(&quotient);
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关系。

 

 

 

参考:boost/boost_1_49_0/doc/html/signals/tutorial.html