using boost::signals2::signal;
controller :: { signal
class chain_plugin_impl {
fc::optional chain;
}
//chain_plugin.cpp slot 函数 slot
my->accepted_block_connection = my->chain->accepted_block.connect([ththis my- >accepted_block_channel.publish(blk);
});
channels::accepted_block::channel_type& accepted_block_channel;
/** Publish data to a channel. This data is _copied on publish. _/
void publish(const Data& data) {
if (has_subscribers()) {
// this will copy data into the lambda
ios_ptr->post(this, data {
_signal(data); // 调用slot
});
}
}
/** subscribe to data on a channel /
template
handle subscribe(Callback cb) {
return handle(_signal.connect(cb));
}
boost::signals2::signal
template< typename Tag, typename Data, typename DispatchPolicy = drop_exceptions >
struct channel_decl {
using channel_type = channel;
using tag_type = Tag;
};
namespace channels {
using accepted_block = channel_decl
}
触发信号
emit( self.accepted_block, pending->_pending_block_state );
template
void emit( const Signal& s, Arg&& a ) {
try {
s(std::forward(a));
}
}
一个信号多个slot 对应
//net_plugin slot 函数
cc.accepted_block.connect( boost::bind(&net_plugin_impl::accepted_block, my.get(), _1));
//producer_plugin slot 函数
my->_accepted_block_connection.emplace(chain.accepted_block.connect( this{ my->on_block( bsp ); } ));
//mongo_plugin slot 函数
my->accepted_block_connection.emplace( chain.accepted_block.connect( & {
my->accepted_block( bs );
} ));
