首页
社区
课程
招聘
[求助]GetMessage函数很神奇
发表于: 2015-9-24 21:03 4806

[求助]GetMessage函数很神奇

2015-9-24 21:03
4806
在windows编程中,创建好窗口,然后就消息循环,消息循环是这样的 while(GetMessage(&msg,NULL,0,0)

{  TranslateMessage(&msg); DispatchMessage(&msg); }这个while里面放的是一个GetMessage函数,如果我把他换成1的话程序就卡死了,如果换成0的话,程序就闪退,那么这个GetMessage为什么不卡死又不闪退呢,真的很神奇?

[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 5461
活跃值: (1410)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
GetMessage(&msg,NULL,0,0)是获取消息队列中的消息,如果没有消息,则会让程序空闲,就不会卡死了,你如果改成WHILE(1),直接死循环,当然卡死了,如果是WHILE(0),当然直接退出了。
2015-9-24 21:27
0
雪    币: 108
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
GetMessage是怎么让程序空闲的,空闲是什么意思,是让这个主线程挂起吗,那我直接while(1){slpeep(1)}还是会卡死啊
2015-9-24 21:48
0
雪    币: 18
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
楼主看来还很初级啊。你知道什么叫卡死吗?那就是因为系统发现不能通过消息控制你的窗口了,就会画出一个卡死的界面,而且你自己也不能控制了,因为你没有GetMesage
2015-9-24 22:51
0
雪    币: 108
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
怪就怪在这里,GetMesage执行不执行关你系统什么事,GetMesage是从自己的消息列队拿东西来放到MSG里面,爱拿我就拿,不爱拿,你系统关我进程做什么,况且系统怎么知道我拿了没有?
2015-9-25 00:33
0
雪    币: 440
活跃值: (963)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
6
GetMessage函数是程序空闲的时候主动将控制权交还给Windows的一种方式,Windows是一个抢占式的多任务系统,任务之间每20 ms切换一次,试想一下,如果窗口程序在主窗口中采用死循环等待,消息由Windows直接发送到窗口过程,那么程序会是下列这种样子:
    invoke  CreateWindow,…
    invoke  ShowWindow,…
    invoke  UpdateWindow,…
    .while  dwQuitFlag == 0    ;要退出时在窗口过程中设置dwQuitFlag
    .endw
    invoke  ExitProcess,…

但这样一来,即使程序在空闲状态,轮到自己的20 ms时间片的时候,CPU时间就会全部消耗在 .while循环中,使用GetMessage的时候,轮到应用程序时间片的时候,如果消息队列里还没有消息,那么程序还是停留在GetMessage内部,这时就可以由Windows当家做主没收这20 ms的时间片,如此保证了CPU资源的合理应用。
2015-9-25 06:16
0
雪    币: 440
活跃值: (963)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
7
可以看一看windows程序设计,里面讲的比较细
2015-9-25 06:23
0
雪    币: 118
活跃值: (72)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
楼上讲解清晰
2015-9-25 06:32
0
雪    币: 135
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
是不是 GetMessage 都会访问同一个自旋锁?
2015-9-25 07:55
0
雪    币: 108
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
程序陷入死循环,那按理来说是什么事情都做不了,可是我还能移动窗口啊,而且鼠标进去的时候一个圈圈在那里转,这两件事情是谁做的,系统内核不可能来管这种小事吧,何况系统怎么知道我的线程是在做死循环呢
2015-9-25 12:13
0
雪    币: 577
活跃值: (805)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
11
窗口卡死的时候(即不响应窗口消息,消息循环不再继续进行)就会出现这种情况。
2015-9-25 13:30
0
游客
登录 | 注册 方可回帖
返回
//