关于内存的问题:很快把我512M内存耗尽

yangxingbo 2004-10-10 09:37:34

我写的一屏保程序,每3S从资源里读取变换一张图片。
下面是关于换图片的代码:

每换一第图片,内存就多用4M左右,我一时也想不出,为什么。有时到了内存会自动释放,有时,则
一直到耗尽内存为止。
private void changeFile()
{

Random r = new Random();
int fileLen = 1;
//把图片做成资源的形式
string[] fileToDisplay ={"DSCF0025.JPG",
"DSCF0029.JPG",
"DSCF0036.JPG",
"DSCF0004.JPG",
"DSCF0012.JPG",
"DSCF0015.JPG",
"DSCF0002.JPG",
"DSCF0010.JPG",
"DSCF0043.JPG",
"DSCF0048.JPG"
};

fileLen = fileToDisplay.Length ;
ResourceManager rm = new ResourceManager ("cCharp.My",Assembly.GetExecutingAssembly ());
Image MyImage = (Bitmap)rm.GetObject(fileToDisplay[r.Next (fileLen)]);
if (MyImage.Width > 800)
{
if (MyImage.Width > MyImage.Height )
{
picBox.Width = 640;
picBox.Height =480;
}
else
{
picBox.Width = 480;
picBox.Height =600;
}
picBox.SizeMode = PictureBoxSizeMode.StretchImage ;
}
else
{
picBox.SizeMode = PictureBoxSizeMode.AutoSize ;
}
picBox.Image = (Image)MyImage;
//
MovePic();
}
...全文
695 37 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
37 条回复
切换为时间正序
请发表友善的回复…
发表回复
abiho 2004-10-10
  • 打赏
  • 举报
回复
做屏保还是用authorware吧,做出来的效果好看
yangxingbo 2004-10-10
  • 打赏
  • 举报
回复
Image.Dispose

对象提供了Dispose方法意思就是让你用完对象后调用
注意PictureBox之类的控件对Image的占用,一定要在更换Image之后再调用Dispose方法

=========
Image MyImage = (Bitmap)rm.GetObject(fileToDisplay[r.Next (fileLen)]);
if (MyImage.Width > 800)
{
if (MyImage.Width > MyImage.Height )
{
picBox.Width = 640;
picBox.Height =480;
}
else
{
picBox.Width = 480;
picBox.Height =600;
}
picBox.SizeMode = PictureBoxSizeMode.StretchImage ;
}
else
{
picBox.SizeMode = PictureBoxSizeMode.AutoSize ;
}
picBox.Image = (Image)MyImage;
//
MovePic();
MyImage.Dispose ();
}

内存不耗了,可能 图片也没了。
yangxingbo 2004-10-10
  • 打赏
  • 举报
回复
今天我也没耗尽过,昨天有过几次。
这样可能好点 ,只在程序加载的时候调用一次。
//加载图片
private void LoadPic()
{
int i = 1;
string[] fileToDisplay ={"DSCF0025.JPG",
"DSCF0029.JPG",
"DSCF0036.JPG",
"DSCF0004.JPG",
"DSCF0012.JPG",
"DSCF0015.JPG",
"DSCF0002.JPG",
"DSCF0010.JPG",
"DSCF0043.JPG",
"DSCF0048.JPG"
};
ResourceManager rm = new ResourceManager("cCharp.My",Assembly.GetExecutingAssembly ());
for ( i = 0 ; i< 10 ; i++)
{
MyImage[i] = (Bitmap)rm.GetObject(fileToDisplay[i]);

}



}
速马 2004-10-10
  • 打赏
  • 举报
回复
Image.Dispose

对象提供了Dispose方法意思就是让你用完对象后调用
注意PictureBox之类的控件对Image的占用,一定要在更换Image之后再调用Dispose方法
cq_lqj 2004-10-10
  • 打赏
  • 举报
回复
我又回来了,不停的读取文件要减少内存是正常的,但减少到一定值肯定要自动增加,不应该有内存耗尽的情况,我运行了一个多小时了吧,一切正常
yangxingbo 2004-10-10
  • 打赏
  • 举报
回复
我也在windows任务管理器(CTRL+ALT+DEL)中看,内存是在减少,但减少到一定值就自动增加了
===
有时候会一直不减少。
yangxingbo 2004-10-10
  • 打赏
  • 举报
回复
是从文件夹读取,我已经运行20分钟左右了吧,内存正常(我还在调试一个大型程序呢,还打开了MSDN、网页、office等),没问题的
===
是的 它有时候可能运行的很好,到50来MB的时候自动又变到16MB左右 ,但有时候 它会不变真
到你内存耗尽。
我也不明白为什么 。这是一个第危险的不稳定的程序

cq_lqj 2004-10-10
  • 打赏
  • 举报
回复
没问题的,我要吃饭了,15分钟后回来
cq_lqj 2004-10-10
  • 打赏
  • 举报
回复
我也在windows任务管理器(CTRL+ALT+DEL)中看,内存是在减少,但减少到一定值就自动增加了
cq_lqj 2004-10-10
  • 打赏
  • 举报
回复
是从文件夹读取,我已经运行20分钟左右了吧,内存正常(我还在调试一个大型程序呢,还打开了MSDN、网页、office等),没问题的
yangxingbo 2004-10-10
  • 打赏
  • 举报
回复
to: cq_lqj(luqinjian)

真的吗?
我也有过这种思路, 但我是从文件夹里读取 ,结果 是一样的。


我是在taskmgr里监视内存的。
yangxingbo 2004-10-10
  • 打赏
  • 举报
回复
把这句
ResourceManager rm = new ResourceManager ("cCharp.My",Assembly.GetExecutingAssembly ());

也定义到外面,只初始化一次

======
也已经试过了
Image MyImage = (Bitmap)rm.GetObject(fileToDisplay[r.Next (fileLen)]);
应该是这名语句 耗的内存。


既然你这些图片都要常用,就一直把他放在内存里好了
补充完毕!!!
====
我有10张图片,让我定义10个Image变量, 在变换的时候 ,picBox.image = MyImage x ;
是这意思吗?
我也这么想,我一张图片才300来K,加一张图片 耗这么多内存。
真是的,
cq_lqj 2004-10-10
  • 打赏
  • 举报
回复
private void changeFile()
{

Random r = new Random();
int fileLen = 1;
//把图片做成资源的形式
string[] fileToDisplay ={"1.JPG",
"2.JPG",
"3.JPG",
"4.JPG",
"5.JPG",
"6.JPG",
"7.JPG",
"8.JPG",
"9.JPG"
};

fileLen = fileToDisplay.Length ;
Bitmap MyImage = new Bitmap(fileToDisplay[r.Next (fileLen)]);
if (MyImage.Width > 800)
{
if (MyImage.Width > MyImage.Height )
{
picBox.Width = 640;
picBox.Height =480;
}
else
{
picBox.Width = 480;
picBox.Height =600;
}
picBox.SizeMode = PictureBoxSizeMode.StretchImage ;
}
else
{
picBox.SizeMode = PictureBoxSizeMode.AutoSize ;
}
picBox.Image = (Image)MyImage;
//
}

我测试了很久没问题的,我还是一秒一次刷的
abiho 2004-10-10
  • 打赏
  • 举报
回复
既然你这些图片都要常用,就一直把他放在内存里好了
补充完毕!!!
CSTerry 2004-10-10
  • 打赏
  • 举报
回复
把这句
ResourceManager rm = new ResourceManager ("cCharp.My",Assembly.GetExecutingAssembly ());

也定义到外面,只初始化一次
abiho 2004-10-10
  • 打赏
  • 举报
回复
那样还是不行,你每次都new了啊?
一次使用内存再多也没事,千万别内存节节攀升
abiho 2004-10-10
  • 打赏
  • 举报
回复
1、你把图片先全部加载,不要在换的时候再加载
yangxingbo 2004-10-10
  • 打赏
  • 举报
回复
Image MyImage;
定义在外面

然后程序里面用
MyImage = (Bitmap)rm.GetObject(fileToDisplay[r.Next (fileLen)]);
试试
====
试过了 没用。不行。

用以下方法取图片吧
Bitmap m_bitmap = new Bitmap(strFileName);
===
我是把10第图片 做成了资源,就是ResourceManager rm = new ResourceManager("cCharp.My",Assembly.GetExecutingAssembly ());
占3MB new Bitmap(strFileName); 这样行吗?
这是我的代码:
Random r = new Random();
int fileLen = 1;

//从文件夹读取图片
string[] fileToDisplay = Directory.GetFiles (@"E:\MyDocument\My Pictures\","*.jpg");
fileLen = fileToDisplay.Length ;
Bitmap MyImage = new Bitmap(fileToDisplay[r.Next (fileLen)]);

结果 还是内存节节攀升。一个样。
yangxingbo 2004-10-10
  • 打赏
  • 举报
回复
试了一下 没用
cq_lqj 2004-10-10
  • 打赏
  • 举报
回复
用以下方法取图片吧
Bitmap m_bitmap = new Bitmap(strFileName);
加载更多回复(17)

111,097

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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