CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
英特尔®游戏设计大赛100美元现金周周送 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

一个很有意思的关于timer的问题

楼主za1mb2yc3(无名)2003-12-03 00:02:50 在 VC/MFC / 基础类 提问

一个很有意思的发现,  
  下面是一个最简单的建立窗口,  
  并设置timer的程序,  
  大家可能不信,  
  只要把onpoint()里的CPaintDC   dc(this);删去  
  ontimer就不执行了,  
  我不知道为什么,  
  大家那们高人可以给出答案  
   
   
  IMPLEMENT_DYNCREATE(CanvasForm,   CFrameWnd)  
   
  CanvasForm::CanvasForm()  
  {  
  Create(NULL,"hello");  
   
  }  
   
  CanvasForm::~CanvasForm()  
  {  
  }  
   
   
  BEGIN_MESSAGE_MAP(CanvasForm,   CFrameWnd)  
  //{{AFX_MSG_MAP(CanvasForm)  
  ON_WM_PAINT()  
  ON_WM_TIMER()  
  ON_WM_CREATE()  
  //}}AFX_MSG_MAP  
  END_MESSAGE_MAP()  
   
  /////////////////////////////////////////////////////////////////////////////  
  //   CanvasForm   message   handlers  
   
  void   CanvasForm::OnPaint()    
  {  
  CPaintDC   dc(this);  
   
  }  
   
  void   CanvasForm::OnTimer(UINT   nIDEvent)    
  {  
  //   TODO:   Add   your   message   handler   code   here   and/or   call   default  
  TRACE("\n\nHELLO\n\n");  
  //MessageBox("hello");  
         
   
  CFrameWnd::OnTimer(nIDEvent);  
   
  }  
   
   
   
  int   CanvasForm::OnCreate(LPCREATESTRUCT   lpCreateStruct)    
  {  
   
  if   (CFrameWnd::OnCreate(lpCreateStruct)   ==   -1)  
  return   -1;  
  SetTimer(1,100,NULL);  
   
  TRACE("SETTIMER");  
  //   TODO:   Add   your   specialized   creation   code   here  
  return   0;  
  } 问题点数:20、回复次数:9Top

1 楼afantict(非洲土狼)回复于 2003-12-03 10:03:14 得分 0

你是怎么判断定时器不工作的?  
  你若在void   CanvasForm::OnTimer(UINT   nIDEvent)   加断点  
  就经过一次  
  以后就不经过了吗?  
   
  Top

2 楼bohut(●伯虎● )回复于 2003-12-03 10:06:43 得分 0

定时器响应函数里要首先关闭定时器,然后再打开Top

3 楼findcsdn(searchcsdn)回复于 2003-12-03 10:20:04 得分 10

是这样子的,如果不写如果不处理wm_paint的消息的默认处理,消息环就会无休止的发送wm_paint,导致cpu占用率100%,而且timer消息级别比较低,所以总是不能发送出来,其实是工作的。Top

4 楼ddddh(叶君临)回复于 2003-12-03 10:22:26 得分 10

哥们,这分我要了  
   
  给你一点提示,MSDN上面关于WM_TIMER有这么一段话:  
   
  The   WM_TIMER   message   is   a   low-priority   message.   The   GetMessage   and   PeekMessage   functions   post   this   message   only   when   no   other   higher-priority   messages   are   in   the   thread's   message   queue.    
   
  TIMER消息是一个低优先级的消息。只有当没有其他高优先级的消息的时候,才会被发送  
   
  好,你在onpaint函数里面如果不调用CPaintDC   dc(this),而且你也没有调用基类的OnPaint,那么窗口的InvalidRect始终存在,也就是系统会不断地发送WM_PAINT消息给你的窗口,那么你的WM_TIMER消息永远不会被Dispatch,SO,你会发现ONTIMER只被调用了一次。  
   
   
  验证这一点很简单,你把SetTimer第三个参数给一个回调函数,这个函数会被调用很多次,说明很多个Timer消息已经被产生。只是你刚才不dispatch而已Top

5 楼ddddh(叶君临)回复于 2003-12-03 10:23:37 得分 0

原来楼上的已经回答了,刚才没看见  
   
   
  不过需要楼上说的需要纠正的是,并非什么cpu占用100%,而是timer的优先级很低的原因。呵呵Top

6 楼flyback(墨羽)回复于 2003-12-03 10:36:22 得分 0

msdn曾经警告过不要在onpaint   中加Getdc之类的操作Top

7 楼fuxf(布衣)回复于 2003-12-03 10:42:55 得分 0

同意各位任兄的见解.Top

8 楼za1mb2yc3(无名)回复于 2003-12-03 23:01:22 得分 0

为什么onpoint如果什么都不写就会不断发送wm_point消息  
  这是一个新手,对消息处理不是特别明白,  
  msdn太大不从哪看起  
  wm_paint是谁发的呢?Top

9 楼Healer()回复于 2003-12-03 23:50:32 得分 0

ddddh(叶君临)   不错,   学习了:)Top

相关问题

  • 很有意思的问题!!
  • 一段很有意思的影片~~
  • 两个很有意思的问题
  • 转一篇很有意思的文章
  • 一个很有意思的问题!
  • 一个很有意思的问题
  • 一个很有意思的小问题!!
  • 迷惑,很有意思的问题
  • 一道很有意思的题.
  • 重载的问题,很有意思

关键词

  • 函数
  • 消息
  • dc
  • canvasform
  • timer
  • ontimer
  • 调用
  • 优先级
  • onpaint
  • cframewnd

得分解答快速导航

  • 帖主:za1mb2yc3
  • findcsdn
  • ddddh

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo