VJGUI消息设计-兼谈MFC、QT和信号/槽机制
星期六下午4点,还在公司加班。终于写完了下周要交工的一个程序。
郁闷,今天这几个小时写了有上千行代码吧?虽然大部分都是Ctrl-C+Ctrl-V,但还是郁闷。
作为一个有10年经验的MFC程序员,郁闷啊......
当初上大学的时候,就是冲着MFC这3个字去学的。
Microsoft Foundation Classes
多么的NB。仿佛这些C打头的类就是构建微软大厦的一根根螺钉。
记不清有多少个日日夜夜守在电脑旁,用VC6的ClassWizard不知疲倦的添加一个又一个的类。
也记不清翻看了多少本VC与MFC的书,并一次又一次的迷失在MFC中几个小时解不了一个Bug...
正如某个外国的程序员所说的“The Microsoft Foundation Classes (MFC) are a nightmarish mess. I'll say it again - the MFC is a programmer's nightmare.”
MFC确实成了很多程序员的噩梦。当我坚持把这个噩梦做醒时,大学已经上完了。。。
再做了3、4个项目以后,我终于可以较熟练的用MFC解决大部分问题了。我曾经(现在也有)这种想法,在MFC里只有想不到的,没有做不到的。也确实是这样,MFC只是WinAPI的一个thin wrapper,灵活度是没问题的。
这种满足感一直持续到我接触了QT,看到了它最经典的消息设计(Signal & Slot)。
卖糕的,这是蒸的馍?
原来消息响应可以如此的优雅,如此的直接,如此的简单。回过头来看看MFC中的Message Map,那感觉,就像刚吃完一份多汁的牛扒后被强迫吃了一块臭豆腐。
我想,作为吃了10年的臭豆腐的人,突然吃到了多汁的牛扒,是有理由狂喜的,同时他又不得不继续吃臭豆腐,是有理由郁闷的。
言归正传,VJGUI是我为开源2D引擎IndieLib写的一个GUI类库。在设计阶段时,我就一直在想各个Widget的消息应该怎样响应。第一个想法自然是callback function,会不会too simple?作为一个吃了10年臭豆腐的人,有理由多想一下。其实我一直在避免使用Callback function,它的耦合性太强了,使得代码很难复用。同时,callback function is not type safe,难道我们喜欢在代码中埋雷?还有一个问题,这些函数使得代码很难看......。下一个想法,实现一个简单的类Windows消息机制,细节还没太想清楚。但要为每种widget加上message pump会不会显得太蠢苯了?另外,使用起来估计可用性不高。最后,利用了一个周末的休息时间,我决定了,为什么不实现QT的信号/槽机制呢?
QT的实现是需要moc的,有没有更清爽的解决方案?回答是肯定的,我找到了sigslot和slotsig这哥俩。
内部它们使用N多的模板(template)来实现信号/槽(本质还是callback function,只不过耦合度降低了,编译时会做有效性检查,更加安全)。C++中那么不起眼的模板,原来还可以这样用。看来学习C++真是永无止境啊。
这样的实现比QT会快一些。slotsig甚至还做了各种信号/槽实现的benchmark。有兴趣的人可以去这里看看。
---------------------------------------------------------------------------------------------------------------
- 2楼 superjoel 2009-07-15 16:30发表 [回复]

- 还是通过STL知道GP的,是个让人充满期待的技术。
我一直觉得VC2008的STL效率有些问题,最近听说VC2010中STL的效率将会大幅提升(看测试vector push back操作只需要原来30%的时间)。还真想尽快试试VC2010正式版,看看能否像MS的目标那样成为新的VC6。
- 1楼 lynx090 2009-07-13 17:03发表 [回复]

- 1:敬仰博主的经验 2:Signals和function在BOOST里都有实现,用来解耦是非常方便的。 3;在C 设计前沿领域,用的最多其实是GP而不是OO,STL、BOOST就是GP的代表作。Matt Austern、Andrei Alexandrescu等大师都是GP领域的神人。C 的模板要比其他语言的模板要强大多了。
http://blog.csdn.net/superjoel/article/details/3990219
VJGUI消息设计-兼谈MFC、QT和信号/槽机制的更多相关文章
- Qt学习记录--02 Qt的信号槽机制介绍(含Qt5与Qt4的差异对比)
一 闲谈: 熟悉Window下编程的小伙伴们,对其消息机制并不陌生, 话说:一切皆消息.它可以很方便实现不同窗体之间的通信,然而MFC库将很多底层的消息都屏蔽了,尽管使用户更加方便.简易地处理消息,但 ...
- C++11实现Qt的信号槽机制
概述 Qt的信号槽机制是Qt的核心机制,按钮点击的响应.线程间通信等都是通过信号槽来实现的,boost里也有信号槽,但和Qt提供的使用接口很不一样,本文主要是用C++11来实现一个简单的信号槽,该信号 ...
- 非Qt工程使用Qt的信号槽机制
非Qt工程,使用Qt的信号槽机制,蛋疼不?反正我现在就是要做这样一件蛋疼的事. 要使用Qt的信号槽机制,下面是从Qt Assist里面关于 signal & slots 的一句介绍: All ...
- QT写hello world 以及信号槽机制
QT是一个C++的库,不仅仅有GUI的库.首先写一个hello world吧.敲代码,从hello world 写起. #include<QtGui/QApplication> #incl ...
- QT信号槽机制
信号槽 信号槽是QT中用于对象间通信的一种机制,也是QT的核心机制.在GUI编程中,我们经常需要在改变一个组件的同时,通知另一个组件做出响应.例如: 一开始我们的Find按钮是未激活的,用户输入要查找 ...
- Qt开发之信号槽机制
一.信号槽机制原理 1.如何声明信号槽 Qt头文件中一段的简化版: class Example: public QObject { Q_OBJECT signals: void customSigna ...
- QT源码之Qt信号槽机制与事件机制的联系
QT源码之Qt信号槽机制与事件机制的联系是本文要介绍的内容,通过解决一个问题,从中分析出的理论,先来看内容. 本文就是来解决一个问题,就是当signal和slot的连接为Qt::QueuedConne ...
- QT学习记录之理解信号槽机制
作者:朱金灿 来源:http://blog.csdn.net/clever101 QT的事件机制采用的信号槽机制.所谓信号槽机制,简而言之就是将信号和信号处理函数绑定在一起,比如一个按钮被单击是一个信 ...
- Qt自定义信号槽的使用浅析+实例
1. Qt中自定义信号槽的使用 Qt框架提供的信号槽在某些特定场景下是无法满足我们的项目需求的,因此我们还设计自己需要的的信号和槽,使用connect()对自定义的信号槽进行连接. 如果想要使用自定义 ...
随机推荐
- Linq to Sqlite连接
本人还是挺喜欢用Sqlite,鼓捣半天终于连上了,赶紧记录一下 1.当然还是新建一个项目,还是winform, 2.Vs2012添加NoGet,点击工具--扩展和更新,搜索NoGet,安装. 3.管理 ...
- iOS开发笔记 基于wsdl2objc调用asp.net WebService
1.准备 先下载待会要用到的工具 WSDL2ObjC-0.6.zip WSDL2ObjC-0.7-pre1.zip 我用的是WSDL2ObjC-0.6.zip 1.1搭建asp.net WebServ ...
- JavaSE复习日记 : Java操作符\关系运算符\逻辑运算符\赋值运算符\字符串连接符\三元运算符
// Java操作符\关系运算符\逻辑运算符\赋值运算符\字符串连接符\三元运算符 /* * 一 Java操作符 * * Java操作符都有哪些? * +, -, *, /, %, ++, -- * ...
- Android应用开发提高篇(3)-----传感器(Sensor)编程
链接地址:http://www.cnblogs.com/lknlfy/archive/2012/02/29/2373420.html 一.概述 Android支持的传感器种类越来越多了,这确实是一件可 ...
- Android应用开发基础篇(8)-----SurfaceView
链接地址:http://www.cnblogs.com/lknlfy/archive/2012/02/25/2368069.html 一.概述 SurfaceView也是一个用来画图的部件,不过由于它 ...
- 1.4. chromium源代码分析 - chromiumframe - 消息系列
Message framework 是对消息循环的封装和扩展,Chromium在消息循环中增加处理内部任务的工作.将内部工作处理寄生在Windows的消息循环中,会有一个问题,就是没有Windows自 ...
- 使用 IObjectSafety 标记 ATL 控件初始化的安全
MSDN原文.这里我将代码使用到了BHO里面,运行调试没问题.拿来分享一下 概要 您可以使用 IObjectSafetyImpl 的默认实现来标记为可安全执行脚本的控件.在许多情况下,您需要将标记为可 ...
- 关于codestyle
如果你的代码易于阅读,那么代码中bug也将会很少,因为一些bug可以很容被调试,并且,其他开发者参与你项目时的门槛也会比较低.因此,如果项目中有多人参与,采取一个有共识的编码风格约定非常有必要. 以t ...
- JavaScript 运动框架 Step by step
http://blog.csdn.net/rsj217/article/details/7986905 关于offsetLeft:http://www.cnblogs.com/JackJiang/ar ...
- ffmpeg 命令详解
常用视频命令 //转码(并添加黑边) ffmpeg -ss start_time -i input.mp4 -t total_duration -vcodec copy/h264/... -acode ...