boost事件处理
2014-05-14 05:26
162 查看
虽然这个库的名字乍一看好象有点误导,但实际上并非如此。 Boost.Signals 所实现的模式被命名为 '信号至插槽' (signal to slot),它基于以下概念:当对应的信号被发出时,相关联的插槽即被执行。 原则上,你可以把单词 '信号' 和 '插槽' 分别替换为 '事件' 和 '事件处理器'。 不过,由于信号可以在任意给定的时间发出,所以这一概念放弃了 '事件' 的名字。
因此,Boost.Signals 没有提供任何类似于 '事件' 的类。 相反,它提供了一个名为
Boost.Signals 定义了其它一些类,位于 boost::signals 名字空间中。 由于
函数
信号是通过调用 s 来触发的,就象普通的函数调用那样。 这个函数的签名对应于作为模板参数传入的签名:因为
调用 s 会引发一个触发器,进而执行相应的
编译后输出:
func1
func2
1
以上例子实际上会把
signal模拟程序:
class Buttion
{
public:
void connect(void (*f)(int, int));
void OnBtnClick();
private:
void (*fuc_)(int, int);
};
void Buttion::connect(void (*f)(int, int))
{
fuc_ = f;
}
void Buttion::OnBtnClick()
{
fuc_(10, 20);
}
void PrintCodeline(int x, int y)
{
cout<<"x:"<<x<<",y:"<<y<<endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
Buttion btn;
btn.connect(&PrintCodeline);
btn.OnBtnClick();
getchar();
return 0;
}
因此,Boost.Signals 没有提供任何类似于 '事件' 的类。 相反,它提供了一个名为
boost::signal的类,定义于
boost/signal.hpp. 实际上,这个头文件是唯一一个需要知道的,因为它会自动包含其它相关的头文件。
Boost.Signals 定义了其它一些类,位于 boost::signals 名字空间中。 由于
boost::signal是最常被用到的类,所以它是位于名字空间boost 中的。
void func() { std::cout<<"Hello World!"<<std::endl; } int main() { signals2::signal <void()> s; s.connect(func); s(); return 0; }
boost::signal实际上被实现为一个模板函数,具有被用作为事件处理器的函数的签名,该签名也是它的模板参数。 在这个例子中,只有签名为
void ()的函数可以被成功关联至信号s。
函数
func()被通过
connect()方法关联至信号s。 由于
func()符合所要求的
void ()签名,所以该关联成功建立。因此当信号s 被触发时,
func()将被调用。
信号是通过调用 s 来触发的,就象普通的函数调用那样。 这个函数的签名对应于作为模板参数传入的签名:因为
void ()不要求任何参数,所以括号内是空的。
调用 s 会引发一个触发器,进而执行相应的
func()函数 - 之前用
connect()关联了的。
int func1() { std::cout<<"func1"<<std::endl; return 1; } int func2() { std::cout<<"func2"<<std::endl; return 2; } int main() { boost::signals2::signal<int ()> s; s.connect(func1); s.connect(func2); std::cout<<s()<<std::endl; return 0; }
编译后输出:
func1
func2
1
func1()和
func2()都具有
int类型的返回值。s 将处理两个返回值,并将它们都写出至标准输出流。 那么,到底会发生什么呢?
以上例子实际上会把
1写出至标准输出流。 两个返回值都被 s 正确接收,但除了第一个值,其它值都会被忽略。 缺省情况下,所有被关联函数中,实际上只有第一个返回值被返回。
signal模拟程序:
class Buttion
{
public:
void connect(void (*f)(int, int));
void OnBtnClick();
private:
void (*fuc_)(int, int);
};
void Buttion::connect(void (*f)(int, int))
{
fuc_ = f;
}
void Buttion::OnBtnClick()
{
fuc_(10, 20);
}
void PrintCodeline(int x, int y)
{
cout<<"x:"<<x<<",y:"<<y<<endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
Buttion btn;
btn.connect(&PrintCodeline);
btn.OnBtnClick();
getchar();
return 0;
}
相关文章推荐
- boost 事件处理
- Boost-事件处理 Boost.Signals
- Boost学习系列4-事件处理(上)
- boost事件处理
- Boost学习系列4-事件处理(下)
- Boost之事件处理Boost.Signals
- boost之路四 事件处理
- boost事件处理
- Henry的VB.NET之旅(十五)—动态事件处理方法
- 处理继承的事件
- Adapter模式在J2SE事件处理中的应用
- 评C#事件处理
- .NET Remoting中的事件处理(.NET Framework 2.0)
- Henry的VB.NET之旅(十三)—标准事件处理程序
- Java Swing中的键盘事件处理
- 增加在ClassWizard中没有罗列事件的处理方法
- 捕获(处理)回发事件
- java小程序中鼠标事件的响应处理(包含右键、双击等)
- 深入分析J2ME平台MIDP高级事件处理机制
- 事件处理函数OnEnter OnExit 使用一例