C++编程利器之信号和槽--回调函数的处理技巧
C++编程利器系列(1)
C++编程利器之信号和槽--回调函数的处理技巧
刚学编程那会儿,最先接触的概念是VC的消息映射:消息映射真伟大,编程时在界面上点一下鼠标,想要什么样的效果就写一段代码,运行时就是什么效果,直到现在,依然非常佩服MFC小组设计的这个工具非常的有效,非常的吸引初学者。这也是前几年VC程序员比较多的一个原因,因为它简单上手。
现在想想,这个工具之所以方便,在于它把一个用户界面的操作事件,对应到了一个响应函数中;更一般的,一个对象把一个事件通知给另一个对象,而设计这两个对象的类时,彼此又不相关,这一功能是非常有用的。MFC中用消息映射,Qt中用信号和槽实现了这样的功能,这两者用起来都比较方便。但是消息映射是MFC独有的;Qt为实现信号和槽专门有一个预处理器,用Qt写出的代码并不是完全标准的C++代码;这都影响了这种功能在更一般的代码中的广泛使用。
感谢开源软件,实际上有多个完全用C++实现的信号和槽,比如libsigc++。该库的设计初衷是实现一个类型安全的回调函数的实现方法。使用该库时要注意,其中的回调函数可以有三种形式,一是无输入参数的函数,二是无输入参数的类成员函数,三是只接收一个输入参数的普通函数,其实,后两种函数几乎可以传入任意数目的参数,因为类有多个成员,普通函数的输入参数也可以是结构体。
另一个比较有特色的实现是模仿C#中的Event设计的,即Poco::Event,它的特点是可以在另外一个线程中执行响应函数,完全不用程序员自己写任何有关多线程的代码,只要调用该事件的notifyAsync()函数即可将注册的全部回调函数在另一个线程中执行一遍,极大的方便了开发。
当然大名鼎鼎的boost库中也提供了一个信号与槽的很好的实现,与libsigc++的功能相仿,不多介绍了。
posted on 2010-12-07 17:34 zhihuichien 阅读(2531) 评论(2) 编辑 收藏 举报