求高手看下如下代码为何运行时内存占用暴涨?

心云意水 2011-02-23 11:09:39
问题说明:
写了个钟表程序,表盘是一张图,因为指针作了一张大图,上边有0-359个度数分别的指向状态,利用程序,抓取每一度的指针状态,将背景去除后,贴到表盘上显示出来。
最早的时候,程序加载这张指针状态图,直接就报内存越界退出了,后来把指针状态图从中间分开,放入两个pictruebox中,运行没有问题了。但是现在出现了运行后内存暴涨,最终报错退出的问题。

个人分析应该是addImg这个函数导致的,但找不出问题所在,请高手不吝赐教!

程序用vs2005C#开发,运行环境wince,

ps:发现内存暴涨的问题,是我将程序在windowsxp系统下运行,看任务管理器看来的。

主函数如下:
private void addImg(Image source,Image bg,PictureBox watch,int i)//指针源图,目标背景图,显示的picturebox,指针索引(0-360)
{Bitmap bitmap=new Bitmap(bg);//目标背景
Bitmap bmp=new Bitmap(source);//要叠加上的图源
watch.Image=null;
int x=0,y=0;
//第180个指针位于新图的(0,0),因此重新计算
if(i>=180)
i-=180;
x=(i%10)*120;//x点为横向第i%10张图*单张宽度
y=((int)(i/10))*95;//(int)i/10所得数为第i张图前有多少行,*95图的宽度,则为目标行y坐标
Graphics g=Graphics.FromImage(bitmap);
ImageAttributes imageAttr=new ImageAttributes();
imageAttr.SetColorKey(Color.FromArgb(255,255,255),Color.FromArgb(255,255,255));//将白色剔出
g.DrawImage(bmp, //要叠加上去的图
new Rectangle(35,35,120,95), //要叠加到背景图的位置,尺寸
x,y,120,95, //要叠加源图的起始坐标、的尺寸
GraphicsUnit.Pixel,imageAttr); //透明阀值
watch.Image=(Bitmap)bitmap.Clone();
// Dispose
g.Dispose();
bitmap.Dispose();
bmp.Dispose();
++count;
}

//利用定时器不停的调用上边的函数
int count=0;
private void t1_Tick(object sender,EventArgs e)
{Image img;
if(count>360)
{t1.Enabled=false;
count=0;
return;
}
if(count<180)
img=pbz1.Image;
else
img=pbz2.Image;
addImg(img,ws.Images[0],pw1,count);
}

如若解决,100分感谢!
...全文
164 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
runer 2011-02-25
  • 打赏
  • 举报
回复
兄弟,做仪表盘指针,可不是这个思路呃
心云意水 2011-02-25
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 hello_liucz 的回复:]
"Bitmap bitmap=new Bitmap(bg);//目标背景
Bitmap bmp=new Bitmap(source);//要叠加上的图源" New 了,函数退出前是否需要delete一下?
[/Quote]
这两个对象,我在后边都释放了:
bitmap.Dispose();
bmp.Dispose();
心云意水 2011-02-25
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 programmerno1 的回复:]
这种推理如果换张更大的图显然站不住脚

个人拙见:实现逻辑不太对 类似这样问题跟内存动态申请与是否准确释放有关
[/Quote]

如果一个Picturebox换张更大的图,例如我前边说的,为分割开的原图1200*2375大小,程序直接报错退出了。。。
ProgrammerNO1 2011-02-25
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 xinyunyishui 的回复:]
想了一早上,估计了一个出问题的地方,用了很笨的法子,最终确定就是这里:
Bitmap bmp=new Bitmap(source);//要叠加上的图源
这句。
前边说了,我有一张很大的图,是指针从0度-359度共计360个指向状态的图,这张图1200*2375大小。用picturebox直接加载,运行程序的时候就报错,说内存越界。后来测试将图从中间截开,用两个picturebox加载,居然不……
[/Quote]

这种推理如果换张更大的图显然站不住脚

个人拙见:实现逻辑不太对 类似这样问题跟内存动态申请与是否准确释放有关
ProgrammerNO1 2011-02-25
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 xinyunyishui 的回复:]
想了一早上,估计了一个出问题的地方,用了很笨的法子,最终确定就是这里:
Bitmap bmp=new Bitmap(source);//要叠加上的图源
这句。
前边说了,我有一张很大的图,是指针从0度-359度共计360个指向状态的图,这张图1200*2375大小。用picturebox直接加载,运行程序的时候就报错,说内存越界。后来测试将图从中间截开,用两个picturebox加载,居然不……
[/Quote]

这种推理如果换张更大的图显然站不住脚

个人拙见:实现逻辑不太对 类似这样问题跟内存动态申请与是否准确释放有关
学飞的笨鸟 2011-02-25
  • 打赏
  • 举报
回复
"Bitmap bitmap=new Bitmap(bg);//目标背景
Bitmap bmp=new Bitmap(source);//要叠加上的图源" New 了,函数退出前是否需要delete一下?
心云意水 2011-02-24
  • 打赏
  • 举报
回复
想了一早上,估计了一个出问题的地方,用了很笨的法子,最终确定就是这里:
Bitmap bmp=new Bitmap(source);//要叠加上的图源
这句。
前边说了,我有一张很大的图,是指针从0度-359度共计360个指向状态的图,这张图1200*2375大小。用picturebox直接加载,运行程序的时候就报错,说内存越界。后来测试将图从中间截开,用两个picturebox加载,居然不报错了!于是开始写程序。
下边的代码:
if(count<180)
img=pbz1.Image;
else
img=pbz2.Image;
就是计算,需要的指针应该位于哪一幅图,然后作为source传递给addImg函数。
早上想了想,我估计(不一定对),Bitmap bmp=new Bitmap(source)这句话,会创建一个source的副本,然后复制给bmp对象,于是内存中就多了半张图,于是内存耗尽。。。
于是,我把指针状态图,彻底分解,每10个状态一张,分解成36张,这样在创建副本的时候,应该内存变化不大。
后来测试,果然内存运行变化不大!蒙对了貌似^^

麻烦楼上两位老大帮忙确认下,会不会是这种问题。谢谢。
下午结贴
yashi 2011-02-24
  • 打赏
  • 举报
回复
你可以把addImg先做成一个空函数,确认是不是由它引起的。
心云意水 2011-02-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 91program 的回复:]
用GetGlobalMemory()函数来获取内存状态,然后输出看看是哪里引起内存增加

一般都是对象没有正确释放造成的。
[/Quote]

函数内部创建的对象,在结束时候都Dispose了,用来显示最终状态的那个picturebox,在每次要显示新图片之前,image也清除了。。。但就是内存不停的涨。。。。

难道和timer控件有关?
91program 2011-02-24
  • 打赏
  • 举报
回复
用GetGlobalMemory()函数来获取内存状态,然后输出看看是哪里引起内存增加

一般都是对象没有正确释放造成的。

19,503

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧