Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1408039
  • 博文数量: 430
  • 博客积分: 9995
  • 博客等级: 中将
  • 技术积分: 4388
  • 用 户 组: 普通用户
  • 注册时间: 2006-05-24 18:04
文章存档

2013年(1)

2008年(2)

2007年(14)

2006年(413)

分类:

2006-06-12 16:45:04



  有不少初学者学完第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关于某个函数的解释中就可看到(由于显示器的限制,有的答案需要滚动窗口才 能看到 :))。所以在这里,笔者也建议读者遇到问题一定要记得查看MSDN,学会使用MSDN并从中汲取知识,将使你受用无穷。

  回到正题,在1.4.3节介绍GetMessage函数时,曾说过如果hWnd参数是无效的窗口句柄或 lpMsg参数是无效的指针时,GetMessage函数将返回?1。当我们关闭窗口时,调用了DestroyWindow来销毁窗口,由于窗口被销毁 了,窗口的句柄当然也就是无效的句柄了,那么GetMessage将返回?1。在C/C++语言中,非0即为真,由于窗口被销毁,句柄变为无效, GetMessage总是返回?1,循环条件总是为真,于是形成了一个死循环,机器当然就“变慢了”。:)
  在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);
       }
      }
     …
  读者可以再次运行修改后的程序,看看运行的结果。

阅读(451) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~