C++编程利器之信号和槽--回调函数的处理技巧
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C++编程利器之信号和槽--回调函数的处理技巧
C++编程利器系列(1)
C++编程利器之信号和槽--回调函数的处理技巧
刚学编程那会⼉,最先接触的概念是VC的消息映射:消息映射真伟⼤,编程时在界⾯上点⼀下⿏标,想要什么样的效果就写⼀段代码,运⾏时就是什么效果,直到现在,依然⾮常佩服MFC⼩组设计的这个⼯具⾮常的有效,⾮常的吸引初学者。
这也是前⼏年VC程序员⽐较多的⼀个原因,因为它简单上⼿。
现在想想,这个⼯具之所以⽅便,在于它把⼀个⽤户界⾯的操作事件,对应到了⼀个响应函数中;更⼀般的,⼀个对象把⼀个事件通知给另⼀个对象,⽽设计这两个对象的类时,彼此⼜不相关,这⼀功能是⾮常有⽤的。
MFC中⽤消息映射,Qt中⽤信号和槽实现了这样的功能,这两者⽤起来都⽐较⽅便。
但是消息映射是MFC独有的;Qt为实现信号和槽专门有⼀个预处理器,⽤Qt写出的代码并不是完全标准的C++代码;这都影响了这种功能在更⼀般的代码中的⼴泛使⽤。
感谢开源软件,实际上有多个完全⽤C++实现的信号和槽,⽐如libsigc++。
该库的设计初衷是实现⼀个类型安全的回调函数的实现⽅法。
使⽤该库时要注意,其中的回调函数可以有三种形式,⼀是⽆输⼊参数的函数,⼆是⽆输⼊参数的类成员函数,三是只接收⼀个输⼊参数的普通函数,其实,后两种函数⼏乎可以传⼊任意数⽬的参数,因为类有多个成员,普通函数的输⼊参数也可以是结构体。
另⼀个⽐较有特⾊的实现是模仿C#中的Event设计的,即Poco::Event,它的特点是可以在另外⼀个线程中执⾏响应函数,完全不⽤程序员⾃⼰写任何有关多线程的代码,只要调⽤该事件的notifyAsync()函数即可将注册的全部回调函数在另⼀个线程中执⾏⼀遍,极⼤的⽅便了开发。
当然⼤名⿍⿍的boost库中也提供了⼀个信号与槽的很好的实现,与libsigc++的功能相仿,不多介绍了。