| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1955 人关注过本帖
标题:windows的消息机制
只看楼主 加入收藏
JZY0801
Rank: 2
等 级:论坛游民
帖 子:25
专家分:36
注 册:2010-12-23
结帖率:0
收藏
已结贴  问题点数:20 回复次数:13 
windows的消息机制
关于GetMessage这个函数有这样的解释:
如果消息队列中没有任何消息(即没有用户输入),这个函数会一直等待到消息队列中有消息,并从消息队列中取出消息!

下面是一段程序代码:
while(!GetMessage(&msg , NULL , 0 , 0))
{
    TranslateMessage(&msg) ;
    DispatchMessage(&msg) ;
}

如果这段代码按照上面的那个讲解,开始的时候应用程序的消息队列中如果没有任何消息,那么GetMessage函数会一直等待消息队列中有消息,也就是可以理解为暂时是无法执行这个while的循环,那么请问一下什么时候才开始执行这个while的循环?也就是说系统是如何将消息放到应用程序消息队列中的。

如果上面那段代码我这样写是否是可以的呢?

do{   
    TranslateMessage(&msg) ;
    DispatchMessage(&msg) ;
    }while(!GetMessage(&msg , NULL , 0 , 0)) ;

这两种写法哪一种是比较好的?


[ 本帖最后由 JZY0801 于 2011-3-7 14:37 编辑 ]
搜索更多相关主题的帖子: windows 应用程序 
2011-03-07 14:15
刘定邦
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:687
专家分:1570
注 册:2010-9-21
收藏
得分:2 
不懂。。
2011-03-07 15:45
vandychan
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
等 级:贵宾
威 望:18
帖 子:2296
专家分:6418
注 册:2010-8-20
收藏
得分:2 
建议你去C++板块

到底是“出来混迟早要还”还是“杀人放火金腰带”?
2011-03-07 18:02
JZY0801
Rank: 2
等 级:论坛游民
帖 子:25
专家分:36
注 册:2010-12-23
收藏
得分:0 
难道就没有人知道这个问题吗?
2011-03-07 18:39
waterstar
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:5
帖 子:984
专家分:2810
注 册:2010-2-12
收藏
得分:2 
个人觉得,第一种方法好。

冰冻三尺,非一日之寒;士别三日,不足刮目相看!
2011-03-07 18:42
baobaoisme
Rank: 7Rank: 7Rank: 7
来 自:AVATAR
等 级:黑侠
帖 子:260
专家分:506
注 册:2010-7-9
收藏
得分:2 
楼主是想问操作系统中的进程通信的消息传递机制吗?
我觉得的你的后面的那种方法不可行,并且是错误的
姑且想象消息的一个缓冲区,如果缓冲区是空的,则没法执行消息的翻译和分发
程序代码:
while(!GetMessage(&msg , NULL , 0 , 0))//我的理解是这样,尝试进入缓冲区,姑且把它叫做临界区吧,感觉像pv操作一样,申请对缓冲区取出消息,如果缓冲区为空,则无法进行
{                                      //操作,即没法进入临界区
    TranslateMessage(&msg) ;
    DispatchMessage(&msg) ;
}
如果按你的第二种方法来,缓冲区消息为空,那么就会发生异常了
我是这么理解的,感觉就是操作系统的进程同步,这里是通过互斥来进行同步,想法上是一样的

[ 本帖最后由 baobaoisme 于 2011-3-7 19:08 编辑 ]
2011-03-07 19:04
你们都要疼我哦
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:火星
等 级:贵宾
威 望:49
帖 子:1296
专家分:2746
注 册:2008-7-13
收藏
得分:2 
这个都有固定的写法,知道怎么写就行了。

消息循环从一开始就已经在循环了,并不是从你源代码上出现那段循环语句的时候才开始循环的。

你拖住其他图标或窗口 从目标窗口上划过,目标窗口也悄悄的在消息循环中有重绘消息。并不单指有用户输入。

了解一下程序领空和系统领空。while循环代码在程序领空,但是无消息的时候,“循环”是在GetMessage内部,也就是在系统领空,CPU时间到该程序后,该程序在系统领空中的GetMessage去获取消息,如果有,则返回到程序领空,进入到while循环,如果没有消息,则GetMessage在自己内部转悠。至于用户程序的消息队列,这是系统在负责维护。

小妹,哥哥看你骨骼清奇,绝非凡人,将来必成大业,不如这样,你先把裤裤脱了,待哥哥为你开启灵窍,然后我们一起努力钻研如何
2011-03-07 20:40
中学者
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:20
帖 子:3554
专家分:80
注 册:2007-9-14
收藏
得分:2 
第一个写法才对。。如果一开始没消息呢??(MS没有文档保证不存在这种情况吧?).  那个循环就是界面程序的核心。如果没有消息,进程就等待,不占用cpu。等到有消息,内核就把消息放入队列,然后将进城重新加入就绪队列。这个过程一直持续到进程结束。大概是这样~

樱花大战,  有爱.
2011-03-07 21:43
cacker
该用户已被删除
收藏
得分:2 
提示: 作者被禁止或删除 内容自动屏蔽
2011-03-07 22:56
JZY0801
Rank: 2
等 级:论坛游民
帖 子:25
专家分:36
注 册:2010-12-23
收藏
得分:0 
在这里我更正一下我的程序里的那个写法,因为我的笔误,导致了在GetMessage函数的前面加了一个“!
在这里表示一下抱歉!

9楼的朋友说GetMessage函数会返回-1 ,确实是这样的,但是返回-1的情况好像很少会发生的吧?!

我的第二种写法我尝试了一下,发现程序也是可以执行的,当然了这个也不能说明什么问题。

我按照第一种写法进行调试,发现在我没有输入任何消息的情况下仍然是可以执行的,同时我也观察了一下msg中的message,发现在最开始运行程序的时候这个值并不是空
的 ,也就是说在开始的时候message的值并不是没有。

我不知道我上面的说法是否是成立的!

希望学习或者了解windows编程的朋友能够进来讨论一下,不管是对是错,起码也可以交流一下!
2011-03-08 22:05
快速回复:windows的消息机制
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015977 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved