您的位置:首页 > 其它

signal-slot 信号槽技术初探二

2012-10-22 22:53 656 查看
看看 sigslot.h 的内部实现, 以比较简单的 signal1为例,它可有一个参数, 两个模板参数一个是参数类型,一个是多线程策略

重点是它的

1) connect 方法 , 将它和目的类和目的方法进行连接

2) emit 方法, 触发消息发送到槽的对应方法

template<class arg1_type, class mt_policy = SIGSLOT_DEFAULT_MT_POLICY>
class signal1 : public _signal_base1<arg1_type, mt_policy>
{
public:
typedef _signal_base1<arg1_type, mt_policy> base;
typedef typename base::connections_list connections_list;
using base::m_connected_slots;

signal1()
{
;
}

signal1(const signal1<arg1_type, mt_policy>& s)
: _signal_base1<arg1_type, mt_policy>(s)
{
;
}

template<class desttype>
void connect(desttype* pclass, void (desttype::*pmemfun)(arg1_type))
{
lock_block<mt_policy> lock(this);
_connection1<desttype, arg1_type, mt_policy>* conn =
new _connection1<desttype, arg1_type, mt_policy>(pclass, pmemfun);
m_connected_slots.push_back(conn);
pclass->signal_connect(this);
}

void emit(arg1_type a1)
{
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();

while(it != itEnd)
{
itNext = it;
++itNext;

(*it)->emit(a1);

it = itNext;
}
}

void operator()(arg1_type a1)
{
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();

while(it != itEnd)
{
itNext = it;
++itNext;

(*it)->emit(a1);

it = itNext;
}
}
};


.... to be continued...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: