17xie > VC++深入详解 > 1.6 消息循环的错误分析
背景:                 
[本书目录] [图书首页] [本书讨论区]  
链接地址:http://www.17xie.com/read-36283.html    注册17xie 一起来写书 实现您的出书梦想!

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.exeCPU占用率接近100,难怪机器“变慢了”。那么这是什么原因呢?实际上这个问题的答案在MSDN中就可以找到,并且就在GetMessage函数的说明文档中。不少初学者在遇到问题时,首先是头脑一片空白,接着就去找人求助,这种思想用在程序开发的学习中,没有什么好处。笔者经常遇到学员问问题,结果有不少问题的答案在MSDN关于某个函数的解释中就可看到(由于显示器的限制,有的答案需要滚动窗口才能看到 J)。所以在这里,笔者也建议读者遇到问题一定要记得查看MSDN,学会使用MSDN并从中汲取知识,将使你受用无穷。

1.7  WinMain.exeCPU占用率接近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);

        }

    }

读者可以再次运行修改后的程序,看看运行的结果。


字数:2969    最后更新:8个月以前 [03-13 21:20]happyskynet 修改
本页编辑者:happyskynet  
[前一页]:1.5 动手写第一个Wi…  [后一页]:1.7 变量的命名约定
[在本页中加入书签] [收藏本书] [推荐本书]
  17xie论坛 > 本书讨论区 > 本页评论   (共0条)
发表评论

用户名称 匿名发表
评论内容
验证码

关于我们 | 版权声明 | 免责声明 | 诚聘英才 | 联系我们 | 合作伙伴 | 友情链接 | 广告合作 | 提交意见
Copyright © 2007 17xie.com 互联网协同写书平台 京ICP备08002671号