网上第一本以TXT格式的VC++深入详解孙鑫的书.全文全以TXT格式,并每一章节都分了目录,清晰易读

源代码在线查看: 01.6 消息循环的错误分析.txt

软件大小: 956 K
上传用户: kzdai22
关键词: TXT VC 目录
下载地址: 免注册下载 普通下载 VIP

相关代码

				1.6   消息循环的错误分析
				有不少初学者学完第1章后,编写了下面的代码:
				
				…
				
				HWND hwnd;
				
				    hwnd=CreateWindow(…);
				
				…
				
				    MSG msg;
				
				    while(GetMessage(&msg,hwnd,0,0))
				
				    {
				
				        TranslateMessage(&msg);
				
				        DispatchMessage(&msg);
				
				    }
				
				…
				
				注意代码中以粗体显示的部分。这段代码基于这样一个想法:第1章的程序只有一个窗口,而我们前面说了GetMessage函数的hWnd参数是用于指定接收属于哪一个窗口的消息,于是不少人就在消息循环中为GetMessage函数的hWnd参数指定了CreateWindow函数返回的窗口句柄。
				
				读者可以用上述代码中的消息循环部分替换1.5节代码中的消息循环部分,然后运行程序,关闭程序。你会发现你的机器变慢了,同时按下键盘上的Ctrl + Alt + Delete键,启动Windows的任务管理器,切换到“进程”选项卡,单击“CPU”项进行排序,你会发现如图1.7所示的情况。
				
				从图1.7中可以看到,WinMain.exe的CPU占用率接近100,难怪机器“变慢了”。那么这是什么原因呢?实际上这个问题的答案在MSDN中就可以找到,并且就在GetMessage函数的说明文档中。不少初学者在遇到问题时,首先是头脑一片空白,接着就去找人求助,这种思想用在程序开发的学习中,没有什么好处。笔者经常遇到学员问问题,结果有不少问题的答案在MSDN关于某个函数的解释中就可看到(由于显示器的限制,有的答案需要滚动窗口才能看到 J)。所以在这里,笔者也建议读者遇到问题一定要记得查看MSDN,学会使用MSDN并从中汲取知识,将使你受用无穷。
				
				
				
				图1.7  WinMain.exe的CPU占用率接近100
				
				回到正题,在1.4.3节介绍GetMessage函数时,曾说过如果hWnd参数是无效的窗口句柄或lpMsg参数是无效的指针时,GetMessage函数将返回-1。当我们关闭窗口时,调用了DestroyWindow来销毁窗口,由于窗口被销毁了,窗口的句柄当然也就是无效的句柄了,那么GetMessage将返回-1。在C/C++语言中,非0即为真,由于窗口被销毁,句柄变为无效,GetMessage总是返回-1,循环条件总是为真,于是形成了一个死循环,机器当然就“变慢了”。J
				
				在MSDN关于GetMessage函数的说明文档中给出了下面的代码:
				
				BOOL bRet;
				
				 
				
				    while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0)
				
				    { 
				
				        if (bRet == -1)
				
				        {
				
				            // handle the error and possibly exit
				
				        }
				
				        else
				
				        {
				
				            TranslateMessage(&msg); 
				
				            DispatchMessage(&msg); 
				
				        }
				
				    }
				
				针对我们这个问题,可以修改上述代码如下:
				
				…
				
				    HWND hwnd;
				
				    hwnd=CreateWindow(…);
				
				    …
				
				    MSG msg;
				
				    BOOL bRet;
				
				 
				
				    while( (bRet = GetMessage( &msg, hwnd, 0, 0 )) != 0)
				
				    { 
				
				        if (bRet == -1)
				
				        {
				
				            // handle the error and possibly exit
				
				            return -1;
				
				        }
				
				        else
				
				        {
				
				            TranslateMessage(&msg); 
				
				            DispatchMessage(&msg); 
				
				        }
				
				    }
				
				…
				
				读者可以再次运行修改后的程序,看看运行的结果。
							

相关资源