- 浏览: 232246 次
- 性别:
- 来自: 广州
-
文章分类
最新评论
-
thebye85:
引用 另外一个需要注意的问题,就是SessionMap和隐藏对 ...
WebWork深度探索之Session -
lanxiaoshuang:
写的真好
说的都是概念——有关编程范式 -
lhz:
grep unique wc你需要的只是这么几个小工具而已
努力做个Pragmatic Programmer
昨天"问题男"老大给我的那篇post:噢,我的第一个基于SDK的窗口写了回复:“为何要PeekMessage呢?这样会令你的程序占用能占用的所有cpu时间,不如GetMessage,在没有消息时线程将被suspend。”这个回复让我思考了很久,也让我有了更多收获。真的很喜欢这种感觉,自己写下了一些简单而不成熟的想法,高手看到了又不吝赐教,正是大家这种知识共享的精神让我每天都有莫大的收获,真的很感谢!有点跑题了,呵呵~~
说实在的,当时在运行自己写的例子的时候,确实发现CPU时间被耗尽了,系统运行得很慢,当时还真的没有反应过来是怎么回事,而且由于当时关注的问题并不在此,也没有去多想,只是想着随后要看一下基于MFC的程序运行会不会也是占用那么多的CPU时间(虽然当时我就知道答案肯定是不会的,呵呵)。直至看到了以上回复的时候,脑袋瓜受到了激发,一些原先完全割裂开的认识被这个回复联系到了一起。
首先,刚开始接触PeekMessage和GetMessage的时候,文档告诉我PeekMessage是一个具有线程异步行为的函数,不管消息队列中是否有消息的,函数都会立即返回。而GetMessage则是一个具有线程同步行为的函数,如果消息队列中没有消息的话,函数就会一直等待,直到消息队列中至少有一条消息的时候,才会返回。先不管线程同步或者异步的话题,光看PeekMessage无论什么情况下都会返回,就会知道例子中的消息处理代码在消息队列中没有消息的时候,会不断的循环执行,就相当一个死循环,CPU不耗尽才怪呢。
其次,正是"问题男"老大的回复让我想起了MFC中的消息处理机制:在那里不也用了PeekMessage函数到消息队列中取消息吗?那她到底是怎样避免死循环的出现的呢?于是,我再次回到CWinThread类中的Run函数中去看个究竟:



































代码中的bIdle的初始值是TRUE,如果PeekMessage返回值为FALSE,也就是当队列中没有消息的时候,那么while中的整个条件语句为TRUE,就会去调用OnIdle函数。由于lIdleCountOnIdle作为OnIdle函数的入参,且初始值为0,而返回的语句则是return lCount < 0,也就是说OnIdle返回值肯定是FALSE,那么bIdle就被赋值为FALSE了,自然就跳出了循环。接着就再进入下一个循环,通过PumpMessage方法去取得消息,而PumpMessage中实质就是调用了GetMessage方法去获得消息。总之在两个循环当中,PeekMessage的作用就象是探路石一样,去check一下队列中的是否有消息,有的话,是怎样的消息,但是她并没有将消息从队列中移除,我们可以通过PeekMessage方法中的最后一个参数就可以看出了。同时,两个循环也是交替进行的,象第二个循环,当消息队列中没有消息的时候,也会再一次回到一个循环。MFC之所以这样设计是希望能够通过OnIdle方法去处理当该窗体所属的线程处于空闲状态的情况,同时也保证了线程不会因为GetMessage而进入休眠状态。
发表评论
-
在String的面前丢脸
2004-06-18 00:39 1289重返C++的世 ... -
Summary of function parameter
2004-07-14 02:33 1180对C++这位入 ... -
此Vector非彼Vector
2004-08-05 15:51 1072在学习STL的过程中,我发现了一个熟悉的面孔— ... -
模板——泛型和STL的基础
2004-08-07 01:01 1350所谓泛型,从字面上可以猜想,就是泛化的类型(型 ... -
让人头痛的Vector(提问篇)
2004-08-07 16:55 1253在写完了此Vector非彼Vector这篇随笔 ... -
我该怎样shuffle呢
2004-08-10 01:47 1244在STL的Algorithm中有着这样的一种算 ... -
WebWork初体验
2004-08-11 17:43 1341在这篇ASP.NET ... -
WebWork深度探索之盲人摸象
2004-08-12 23:54 1179昨天尝试着利用WebWork做了一个小功能[1 ... -
WebWork深度探索之号外
2004-08-14 09:03 1075昨天开始对WebWork进行了一些初步的探索[ ... -
WebWork深度探索之标签库
2004-08-15 00:28 1549由于WebWork本身提供了一套自定义的标签库 ... -
什么是Law of Demeter
2004-08-15 14:22 1264今天一如昨日,继续对WebWork进行小打小闹 ... -
所谓的Dumb Question
2004-08-15 17:16 1063为了能够更 ... -
WebWork深度探索之标签库(续)
2004-08-16 15:58 1149昨日对WebWork的标签库进行了小小的研究[ ... -
WebWork深入探索之初见端倪
2004-08-19 16:35 943使用WebWork进 ... -
建网站的小Tips
2004-08-20 23:58 1057这几天都在忙着做一个小网站,从网页美工到后台处 ... -
URL与RequestDispatcher
2004-08-21 23:58 1021今天照例继续自己的网站建设之旅,原本以为可以大 ... -
WebWork深度探索之Pitfall
2004-08-25 14:31 1002在使用WebWork进行开发的过程中,她的种种 ... -
WebWork深度探索之Session
2004-08-26 15:38 1540昨天上午刚 ... -
搞笑的textarea标签
2004-08-31 18:17 1595很久没有用 ... -
两天四疑问
2004-09-03 10:56 10189月份的前两天,我仍然做着网站开发的工作。在开 ...
相关推荐
C语言库函数,C++库函数,C++教程,the C++ primer plus,the C++ standard library,MFC深入浅出,WIN32API大全,Effective C++ 2rd edition,汇编语言全接触.chm,win2000api.exe,Win32 APIfor Visual Basic 大全.chm,...
│ │ ├─考前预测的三套题 │ │ │ Desktop_.ini │ │ │ Mock Exam - JCHQ - SCJP Exam 2.doc │ │ │ Mock Exam - JCHQ - SCJP Exam 2.pdf │ │ │ Mock Exam - JCHQ - SCJP Exam 3.pdf │ │ │ SCJP_...
│ │ ├─考前预测的三套题 │ │ │ Desktop_.ini │ │ │ Mock Exam - JCHQ - SCJP Exam 2.doc │ │ │ Mock Exam - JCHQ - SCJP Exam 2.pdf │ │ │ Mock Exam - JCHQ - SCJP Exam 3.pdf │ │ │ SCJP_...
│ │ ├─考前预测的三套题 │ │ │ Desktop_.ini │ │ │ Mock Exam - JCHQ - SCJP Exam 2.doc │ │ │ Mock Exam - JCHQ - SCJP Exam 2.pdf │ │ │ Mock Exam - JCHQ - SCJP Exam 3.pdf │ │ │ SCJP_...
│ │ ├─考前预测的三套题 │ │ │ Desktop_.ini │ │ │ Mock Exam - JCHQ - SCJP Exam 2.doc │ │ │ Mock Exam - JCHQ - SCJP Exam 2.pdf │ │ │ Mock Exam - JCHQ - SCJP Exam 3.pdf │ │ │ SCJP_...
│ │ ├─考前预测的三套题 │ │ │ Desktop_.ini │ │ │ Mock Exam - JCHQ - SCJP Exam 2.doc │ │ │ Mock Exam - JCHQ - SCJP Exam 2.pdf │ │ │ Mock Exam - JCHQ - SCJP Exam 3.pdf │ │ │ SCJP_...