美文网首页
WebRTC的Signal机制

WebRTC的Signal机制

作者: 霜之幽语 | 来源:发表于2017-12-23 13:52 被阅读24次

    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()将会执行。

    相关文章

      网友评论

          本文标题:WebRTC的Signal机制

          本文链接:https://www.haomeiwen.com/subject/ktgfgxtx.html