能力值:
( LV2,RANK:10 )
|
-
-
2 楼
GetMessage(&msg,NULL,0,0)是获取消息队列中的消息,如果没有消息,则会让程序空闲,就不会卡死了,你如果改成WHILE(1),直接死循环,当然卡死了,如果是WHILE(0),当然直接退出了。
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
GetMessage是怎么让程序空闲的,空闲是什么意思,是让这个主线程挂起吗,那我直接while(1){slpeep(1)}还是会卡死啊
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
楼主看来还很初级啊。你知道什么叫卡死吗?那就是因为系统发现不能通过消息控制你的窗口了,就会画出一个卡死的界面,而且你自己也不能控制了,因为你没有GetMesage
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
怪就怪在这里,GetMesage执行不执行关你系统什么事,GetMesage是从自己的消息列队拿东西来放到MSG里面,爱拿我就拿,不爱拿,你系统关我进程做什么,况且系统怎么知道我拿了没有?
|
能力值:
( 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资源的合理应用。
|
能力值:
( LV3,RANK:30 )
|
-
-
7 楼
可以看一看windows程序设计,里面讲的比较细
|
能力值:
( LV4,RANK:50 )
|
-
-
8 楼
楼上讲解清晰
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
是不是 GetMessage 都会访问同一个自旋锁?
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
程序陷入死循环,那按理来说是什么事情都做不了,可是我还能移动窗口啊,而且鼠标进去的时候一个圈圈在那里转,这两件事情是谁做的,系统内核不可能来管这种小事吧,何况系统怎么知道我的线程是在做死循环呢
|
能力值:
( LV3,RANK:30 )
|
-
-
11 楼
窗口卡死的时候(即不响应窗口消息,消息循环不再继续进行)就会出现这种情况。
|
|
|