7655|11

1

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

关于Wince中OnPaint函数的问题 [复制链接]

本人在做wince时钟显示界面时遇到了点问题,希望能够在这里得到解答

这是OnPaint函数,设置了定时器每55ms刷新调用Invalidate(),强制发送消息WM_PAINT
DrawNeedle()函数是用来绘制指针的,因为每55ms要绘制一直CPen,必须在OnPaint里做重绘的处理,否则会留下的痕迹
OnPaint中用了双缓冲防止闪烁,现在要显示的内容画到memDC对应的cBitmap上,最后在画到DC上

问题:程序运行了一段时间后,指针反映会变慢,原来以为是内存的问题,可是发现内存使用率一直都很稳定,看了下CPU使用的情况,正常时用25ms,一个时间片,很卡的时候就会用到三个时间片,但是不知道到底是什么原因引起的,希望能得到解答



  1. void XXXX::OnPaint()
  2. {
  3.         CPaintDC dc(this); // device context for painting
  4.         // TODO: 在此处添加消息处理程序代码
  5.         // 不为绘图消息调用 CDialog::OnPaint() 

  6.         CDC   memDC;   
  7.         CBitmap   cBitmap;   
  8.         CBitmap*   pOldMemBmp   =   NULL;   

  9.         cBitmap.CreateCompatibleBitmap( &dc,320,240);
  10.         memDC.CreateCompatibleDC(&dc);   
  11.         pOldMemBmp   =   memDC.SelectObject(&cBitmap);

  12.         DrawBmp(&memDC,IDB_BACKGROUND,&rBackground);//总背景320*240
  13.         DrawBmp(&memDC,IDB_PANEL_BK,&rPanel);//时钟表盘背景
  14.        
  15.         CString strSpd;
  16.         strSpd.Format(_T("%d"),Angle);
  17.         DrawText(&memDC,&strSpd,&rText);
  18.         DrawNeedle(Angle,&memDC);//使用CPen绘制Needle,

  19.         dc.BitBlt
  20.                 (0,     
  21.                 0,     
  22.                 320,   
  23.                 240,   
  24.                 &memDC,   
  25.                 0,0,SRCCOPY);

  26.         //清空内存
  27.         memDC.SelectObject(pOldMemBmp);
  28.         memDC.DeleteDC();
  29.         cBitmap.DeleteObject();
  30.         delete pOldMemBmp;

  31. }

复制代码

最新回复

zjl
内存没有问题,我检查过了,问题解决了,是因为OnPaint函数中必须要使用CPaintDC dc来实现画图,否则会重复发送WM_PAINT来重绘,消息队列太过大了,就会狂占CPU了,好了,谢谢各位支持,派分,结贴  详情 回复 发表于 2009-9-11 16:15
点赞 关注

回复
举报

1

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
不懂!帮顶!
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
LZ的定时器用的是什么?
SetTimer,还是其它?
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

4
 
两个用处,一个用来更新Angle的值,方便在OnPaint中显示,还有一个就是调用Invalidate(),强制发送消息WM_PAINT 来刷新的,两个时间都为55ms,一同SetTimer的,这样会冲突吗,Cpu使用率很高的,卡的不行
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

5
 
为什么要用两个timer?
55ms是不是太小了,1000ms不行吗?
 
 
 

回复

1

帖子

0

TA的资源

禁止访问

6
 
提示: 作者被禁止或删除 内容自动屏蔽
 
 
 

回复

4

帖子

0

TA的资源

一粒金砂(初级)

7
 
55ms间隔的刷新OnPaint到底会不会很占用CPU,有没有那位老大知道啊
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

8
 
55ms 刷新OnPaint 没有必要, 秒钟的话500或者1000ms刷新一次就可以了
获取角度数据可以55ms一次
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

9
 
但是我数据变化是ms级的,可能在一秒内angle会有二三十的变化,这样刷肯定太慢了,我现在的问题就是55ms刷OnPaint到底会不会很占CPU,而且我还要不挺的刷一个一百多K的Bmp,这样改怎么办
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

10
 
引用 8 楼 fjutwx 的回复:
但是我数据变化是ms级的,可能在一秒内angle会有二三十的变化,这样刷肯定太慢了,我现在的问题就是55ms刷OnPaint到底会不会很占CPU,而且我还要不挺的刷一个一百多K的Bmp,这样改怎么办

不刷“一个一百多K的Bmp”应该就不会了,楼主可以试试先不刷bmp,看看会不会变慢
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

11
 
先看看是否有内存泄露,这样快的刷如果显示部分GDI对象没有正确清除可能会有问题。

当然在没有产生内存泄露的情况下,有可能产生太多的内存碎片,也会响应系统性能。
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

12
 
内存没有问题,我检查过了,问题解决了,是因为OnPaint函数中必须要使用CPaintDC dc来实现画图,否则会重复发送WM_PAINT来重绘,消息队列太过大了,就会狂占CPU了,好了,谢谢各位支持,派分,结贴
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条
电源解决方案和技术 | DigiKey 应用探索站
当月好物、电源技术资源、特色活动、DigiKey在线实用工具,干货多多~

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表