标题:【原创】【编著】【技术专题】信号机制(全文)
作者:fanyu
日期:2005-09-08 09:45
内容:
Qt用预编译器和宏来保证强大的跨平台能力,信号机制则是其中最精妙之处。本文分析了几种常见的信号处理机制,然后详细介绍了Qt的Signal/Slot机制。
关键词:信号机制Signal/Slot Win32 MFC Linux Qt
首先要说明,这里所说的信号不是Unix中进程间通信的信号。这里的信号更多地与图形界面的输入输出联系在一起(当然也可以是不可见的操作)。自从计算机程序从字符界面转为图形界面,用户的输入一下子变得繁杂和丰富起来,不同的输入位置、不同的输入设备、不同的焦点位置、不同的输入值组合起来构成了许许多多的信号。一下子,这个世界变得五彩缤纷。当前的三大主流操作系统——Windows、Unix和MAC都提供了令人赏心悦目的图形界面。虽然它们出自不同公司,自身还有很多分支,但是在图形操作与管理上还是大致类同的:都有桌面、有图标,有大大小小规则或不规则的窗口,窗口上有标题、边框、菜单以及按钮等各种控件,用户可以用键盘在当前焦点输入内容,可以用鼠标点击任意的窗口和控件。就能动性来说,是由用户主导程序下一步作何操作,而不象字符时代那样由程序来主导用户。这也就是所谓的“事件驱动”。在一个事件驱动的系统中,不论是Windows,还是Unix,都脱离不了以下的处理框架:
当某个应用程序收到操作系统发送的事件时,它就要判断这个事件该由谁处理。处理过程本身又可能引起新的事件发生,这就要告诉操作系统我发出了什么信号。如此这般循环往复,青山之水常流。那么,一个具体的信号究竟是如何触发与它对应的函数呢?绝大部分的系统都是采用了回调的机制,所谓“回调”其实就是指向某一个函数的指针。在C语言中函数名其实也是一个指针,因此回调其实是一个指向指针的指针。在不同的开发框架或开发包中,对于回调的实现有着一些细微的差别。初接触Qt时,我一直在想它是如何处理各种平台的信号调用。虽然C语言本身是平台无关的,但具体到某一个操作系统、某一个开发包,信号机制会有些不同。而信号是面向对象的开发环境中一个很重要的环节,如果要设计一个类库或程序框架,就必须很好地考虑不同平台间的差异。接触了Qt之后,感觉Qt选择了一条颇具特色的处理途径——Signals/Slot,中文名暂定为“信号/反应槽”。在Qt的内部设计中,通过信号/反应槽(signals/slot)的使用对回调进行了很好的封装。为了更好地了解该机制我们先看一下其他几种常用的信号相关程序。
1.Win32
Win32的程序总是从WinMain开始执 ..