WebRTC中大量使用信号与槽的机制,主要的类如下:
1.has_slots包含有一个Signal的集合,它主要有两个操作:
void signal_connect(_signal_base_interface* sender)
{
lock_block<mt_policy> lock(this);
m_senders.insert(sender); //将一个_signal_base_interface插入集合中
}
void signal_disconnect(_signal_base_interface* sender)
{
lock_block<mt_policy> lock(this);
m_senders.erase(sender); //从集合中删除一个_signal_base_interface
}
2.signal()
template<class desttype>
void connect(desttype* pclass, void (desttype::*pmemfun)())
{
lock_block<mt_policy> lock(this);
//为回调函数pmemfun创建一个connection
_connection0<desttype, mt_policy>* conn =
new _connection0<desttype, mt_policy>(pclass, pmemfun);
//将一个connection插入链表中
m_connected_slots.push_back(conn);
pclass->signal_connect(this);
}
void emit()
{
lock_block<mt_policy> lock(this);
typename connections_list::const_iterator itNext, it = m_connected_slots.begin();
typename connections_list::const_iterator itEnd = m_connected_slots.end();
//执行所有的connection中的回调
while(it != itEnd)
{
itNext = it;
++itNext;
(*it)->emit(); //实际调用connection的回调函数
it = itNext;
}
}
3._connection()
例子
总结一下,一个类如果让自己的成员函数称为“槽”(对应connection),必须继承自has_slots(具体原因看源码),举个例子:
一个signal为:
sigslot::signal1<AsyncSocket*> SignalConnectEvent;
signal连接一个槽:
SignalConnectEvent.connect(this,
&PeerConnectionClient::OnConnect);
触发信号:
SignalConnectEvent.emit();
然后PeerConnectionClient的OnConnect()将会执行。
网友评论