34 个解决方案
#1
本人初用 C# 请高手指点一二
以提高本人对学 C# 的积极性
不胜感激!
以提高本人对学 C# 的积极性
不胜感激!
#2
有多少人在线?怎不见有高手回答问题?
#3
相关代码如下:
private void button1_Click(object sender, System.EventArgs e)
{
openFileDialog1.ShowDialog();
}
private void openFileDialog1_FileOk(object sender, System.ComponentModel.CancelEventArgs e)
{
FileNames = openFileDialog1.FileNames;
panel7.Invalidate();
}
private void panel7_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
{
if (FileNames == null)
return;
if (FileNames.Length == 0)
return;
Graphics graphics = e.Graphics;
int cx = 2;
int cy = 2;
int Width = 60;
int Height = 60;
for (int Index = 0; Index < FileNames.Length; Index ++)
{
Image image = Image.FromFile(FileNames[Index]);
graphics.DrawImage(image, cx + (Index % 3) * (Width + cx),
cy + (Index / 3) * (Height + cy), Width, Height);
}
}
private void button1_Click(object sender, System.EventArgs e)
{
openFileDialog1.ShowDialog();
}
private void openFileDialog1_FileOk(object sender, System.ComponentModel.CancelEventArgs e)
{
FileNames = openFileDialog1.FileNames;
panel7.Invalidate();
}
private void panel7_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
{
if (FileNames == null)
return;
if (FileNames.Length == 0)
return;
Graphics graphics = e.Graphics;
int cx = 2;
int cy = 2;
int Width = 60;
int Height = 60;
for (int Index = 0; Index < FileNames.Length; Index ++)
{
Image image = Image.FromFile(FileNames[Index]);
graphics.DrawImage(image, cx + (Index % 3) * (Width + cx),
cy + (Index / 3) * (Height + cy), Width, Height);
}
}
#4
看是不是你循环语句有问题。还有图片文件如果大了的话是很占内存的。
#5
你看一下机器的配置吧。.net吃内存比较厉害。
#6
循环语句就在上面,图片每个只有几 K 而已,图片文件个数也只有 10 个左右
另:C#不会自己增加分配内存吗?我的机子内存还多的是呀!
另:C#不会自己增加分配内存吗?我的机子内存还多的是呀!
#7
在panel7_Paint方法de的For循环中最后一行加上
image.Dispose();
原因是你必须释放资源。
image.Dispose();
原因是你必须释放资源。
#8
懒得写一个Form,自动发到feidao@vip.163.com,看看.
#9
我加了 image.Dispose();
也是一样的有错!
也是一样的有错!
#10
已 发到 feidao@vip.163.com 了
麻烦看看
麻烦看看
#11
up
#12
我原来也发现过这样的问题,经过试验,发现是相对路径的问题,我的数据都保存到当前目录的data文件夹下面,也就是说,我在程序又使用诸如"data\\a.txt"之类的文件,一般是正确的,但使用了打开/关闭文件等对话框后,当前路径就变了,如本来是myPro\data,就变成了你打开的文件所在的路径下,因此,我将程序改成Application.StatrPaht().Trim()+"\\data\\a.txt"之类就可以了,看看是不是这个原因.
#13
我使用的是绝对路径(全路径名)
与你所说的不同
而且它能显示一部分图片
当我选择 10 个左右图片文件时就出错
与你所说的不同
而且它能显示一部分图片
当我选择 10 个左右图片文件时就出错
#14
up
#15
你在哪里加的Dispose?是循环里面吗?
#16
1。建议在一个大Panel内创建多个小Panel,在每个小Panel里各Load一张Image,尽量只重画发生变化的小Panel,而不是把所有的画都放在一个大Panel,一口气都画出来。
2。如果不显式释放内存,而仅仅靠C#的内存机制释放内存,并不能立竿见影,需要较长的一段时间。
2。如果不显式释放内存,而仅仅靠C#的内存机制释放内存,并不能立竿见影,需要较长的一段时间。
#17
我运行程序,没有任何问题啊??
我打开了200个我私人珍藏的MM图片也没有问题啊..他们一个个都是100K左右的东东啊:))
内存CPU都是正常的!!
是不是你机器的原因??
我的环境:
WinXP Pro + SP1 + .net framework 1.1(1.0 sp2)
1.7G + 256M
我打开了200个我私人珍藏的MM图片也没有问题啊..他们一个个都是100K左右的东东啊:))
内存CPU都是正常的!!
是不是你机器的原因??
我的环境:
WinXP Pro + SP1 + .net framework 1.1(1.0 sp2)
1.7G + 256M
#18
这样的配置可以了,dispose()没用,不知道是什么问题
#19
你的代码有问题!!!
你的代码没有释放通用对话框资源,在程序运行期间,这些对话框被CLR认为你一直在使用而实际没有用.你的代码也没有释放图象资源,只要没有释放的资源被征用时,就会警告内存不足,请参看下面的代码修改!
private void openFileDialog1_FileOk(object sender, System.ComponentModel.CancelEventArgs e)
{
FileNames = openFileDialog1.FileNames;
panel7.Invalidate();
openFileDialog1.Dispose();// 请添加
}
private void panel7_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
{
if (FileNames == null)
return;
if (FileNames.Length == 0)
return;
Graphics graphics = e.Graphics;
int cx = 2;
int cy = 2;
int Width = 60;
int Height = 60;
for (int Index = 0; Index < FileNames.Length; Index ++)
{
Image image= Image.FromFile(FileNames[Index]); graphics.DrawImage(image, cx + (Index % 3) * (Width + cx),
cy + (Index / 3) * (Height + cy), Width, Height);
if(image!=null)
image.Dispose();//确保释放图象资源!!!!!!
}
}
你的代码没有释放通用对话框资源,在程序运行期间,这些对话框被CLR认为你一直在使用而实际没有用.你的代码也没有释放图象资源,只要没有释放的资源被征用时,就会警告内存不足,请参看下面的代码修改!
private void openFileDialog1_FileOk(object sender, System.ComponentModel.CancelEventArgs e)
{
FileNames = openFileDialog1.FileNames;
panel7.Invalidate();
openFileDialog1.Dispose();// 请添加
}
private void panel7_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
{
if (FileNames == null)
return;
if (FileNames.Length == 0)
return;
Graphics graphics = e.Graphics;
int cx = 2;
int cy = 2;
int Width = 60;
int Height = 60;
for (int Index = 0; Index < FileNames.Length; Index ++)
{
Image image= Image.FromFile(FileNames[Index]); graphics.DrawImage(image, cx + (Index % 3) * (Width + cx),
cy + (Index / 3) * (Height + cy), Width, Height);
if(image!=null)
image.Dispose();//确保释放图象资源!!!!!!
}
}
#20
gz!
STUDY!
STUDY!
#21
真高兴 有学到了点东西!哈 谢谢 海天 哈
#22
收藏
#23
gz
#24
收藏
#25
up
#26
hehe
同样的错误
同样的错误
#27
是不是瑞星之类的追着跑,来这怪M$ ..
#28
我从来不用 瑞星
呵呵
MS 也会有问题的
要不然 比尔.改死 也不至于叫 补丁大王 了
呵呵
MS 也会有问题的
要不然 比尔.改死 也不至于叫 补丁大王 了
#29
TO: 飞刀
我换了台机子也不行
是不是 我的 .NET 版本有问题?
我换了台机子也不行
是不是 我的 .NET 版本有问题?
#30
这是一个简单的问题, 相对来说. 我碰到过一个真正的内存漏出的c#问题.
当时,是由于gdi + 对象的new 试用与CollectionBase的问题.
.Net在Gdi+方面还是有一定的问题的. 我想.
当时,是由于gdi + 对象的new 试用与CollectionBase的问题.
.Net在Gdi+方面还是有一定的问题的. 我想.
#31
杀毒!
加内存!
加内存!
#32
问题依旧:
************** 异常文本 **************
System.OutOfMemoryException: 内存不足。
at System.Drawing.Image.FromFile(String filename, Boolean useEmbeddedColorManagement)
at System.Drawing.Image.FromFile(String filename)
at MMSComposer.Form1.panel7_Paint(Object sender, PaintEventArgs e) in d:\mms vasp\mmscomposer\form1.cs:line 957
at System.Windows.Forms.Control.OnPaint(PaintEventArgs e)
at System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e, Int16 layer, Boolean disposeEventArgs)
at System.Windows.Forms.Control.WmPaint(Message& m)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
at System.Windows.Forms.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
************** 异常文本 **************
System.OutOfMemoryException: 内存不足。
at System.Drawing.Image.FromFile(String filename, Boolean useEmbeddedColorManagement)
at System.Drawing.Image.FromFile(String filename)
at MMSComposer.Form1.panel7_Paint(Object sender, PaintEventArgs e) in d:\mms vasp\mmscomposer\form1.cs:line 957
at System.Windows.Forms.Control.OnPaint(PaintEventArgs e)
at System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e, Int16 layer, Boolean disposeEventArgs)
at System.Windows.Forms.Control.WmPaint(Message& m)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
at System.Windows.Forms.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
#33
up
#34
感觉用Dispose 方法没什么效果
#1
本人初用 C# 请高手指点一二
以提高本人对学 C# 的积极性
不胜感激!
以提高本人对学 C# 的积极性
不胜感激!
#2
有多少人在线?怎不见有高手回答问题?
#3
相关代码如下:
private void button1_Click(object sender, System.EventArgs e)
{
openFileDialog1.ShowDialog();
}
private void openFileDialog1_FileOk(object sender, System.ComponentModel.CancelEventArgs e)
{
FileNames = openFileDialog1.FileNames;
panel7.Invalidate();
}
private void panel7_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
{
if (FileNames == null)
return;
if (FileNames.Length == 0)
return;
Graphics graphics = e.Graphics;
int cx = 2;
int cy = 2;
int Width = 60;
int Height = 60;
for (int Index = 0; Index < FileNames.Length; Index ++)
{
Image image = Image.FromFile(FileNames[Index]);
graphics.DrawImage(image, cx + (Index % 3) * (Width + cx),
cy + (Index / 3) * (Height + cy), Width, Height);
}
}
private void button1_Click(object sender, System.EventArgs e)
{
openFileDialog1.ShowDialog();
}
private void openFileDialog1_FileOk(object sender, System.ComponentModel.CancelEventArgs e)
{
FileNames = openFileDialog1.FileNames;
panel7.Invalidate();
}
private void panel7_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
{
if (FileNames == null)
return;
if (FileNames.Length == 0)
return;
Graphics graphics = e.Graphics;
int cx = 2;
int cy = 2;
int Width = 60;
int Height = 60;
for (int Index = 0; Index < FileNames.Length; Index ++)
{
Image image = Image.FromFile(FileNames[Index]);
graphics.DrawImage(image, cx + (Index % 3) * (Width + cx),
cy + (Index / 3) * (Height + cy), Width, Height);
}
}
#4
看是不是你循环语句有问题。还有图片文件如果大了的话是很占内存的。
#5
你看一下机器的配置吧。.net吃内存比较厉害。
#6
循环语句就在上面,图片每个只有几 K 而已,图片文件个数也只有 10 个左右
另:C#不会自己增加分配内存吗?我的机子内存还多的是呀!
另:C#不会自己增加分配内存吗?我的机子内存还多的是呀!
#7
在panel7_Paint方法de的For循环中最后一行加上
image.Dispose();
原因是你必须释放资源。
image.Dispose();
原因是你必须释放资源。
#8
懒得写一个Form,自动发到feidao@vip.163.com,看看.
#9
我加了 image.Dispose();
也是一样的有错!
也是一样的有错!
#10
已 发到 feidao@vip.163.com 了
麻烦看看
麻烦看看
#11
up
#12
我原来也发现过这样的问题,经过试验,发现是相对路径的问题,我的数据都保存到当前目录的data文件夹下面,也就是说,我在程序又使用诸如"data\\a.txt"之类的文件,一般是正确的,但使用了打开/关闭文件等对话框后,当前路径就变了,如本来是myPro\data,就变成了你打开的文件所在的路径下,因此,我将程序改成Application.StatrPaht().Trim()+"\\data\\a.txt"之类就可以了,看看是不是这个原因.
#13
我使用的是绝对路径(全路径名)
与你所说的不同
而且它能显示一部分图片
当我选择 10 个左右图片文件时就出错
与你所说的不同
而且它能显示一部分图片
当我选择 10 个左右图片文件时就出错
#14
up
#15
你在哪里加的Dispose?是循环里面吗?
#16
1。建议在一个大Panel内创建多个小Panel,在每个小Panel里各Load一张Image,尽量只重画发生变化的小Panel,而不是把所有的画都放在一个大Panel,一口气都画出来。
2。如果不显式释放内存,而仅仅靠C#的内存机制释放内存,并不能立竿见影,需要较长的一段时间。
2。如果不显式释放内存,而仅仅靠C#的内存机制释放内存,并不能立竿见影,需要较长的一段时间。
#17
我运行程序,没有任何问题啊??
我打开了200个我私人珍藏的MM图片也没有问题啊..他们一个个都是100K左右的东东啊:))
内存CPU都是正常的!!
是不是你机器的原因??
我的环境:
WinXP Pro + SP1 + .net framework 1.1(1.0 sp2)
1.7G + 256M
我打开了200个我私人珍藏的MM图片也没有问题啊..他们一个个都是100K左右的东东啊:))
内存CPU都是正常的!!
是不是你机器的原因??
我的环境:
WinXP Pro + SP1 + .net framework 1.1(1.0 sp2)
1.7G + 256M
#18
这样的配置可以了,dispose()没用,不知道是什么问题
#19
你的代码有问题!!!
你的代码没有释放通用对话框资源,在程序运行期间,这些对话框被CLR认为你一直在使用而实际没有用.你的代码也没有释放图象资源,只要没有释放的资源被征用时,就会警告内存不足,请参看下面的代码修改!
private void openFileDialog1_FileOk(object sender, System.ComponentModel.CancelEventArgs e)
{
FileNames = openFileDialog1.FileNames;
panel7.Invalidate();
openFileDialog1.Dispose();// 请添加
}
private void panel7_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
{
if (FileNames == null)
return;
if (FileNames.Length == 0)
return;
Graphics graphics = e.Graphics;
int cx = 2;
int cy = 2;
int Width = 60;
int Height = 60;
for (int Index = 0; Index < FileNames.Length; Index ++)
{
Image image= Image.FromFile(FileNames[Index]); graphics.DrawImage(image, cx + (Index % 3) * (Width + cx),
cy + (Index / 3) * (Height + cy), Width, Height);
if(image!=null)
image.Dispose();//确保释放图象资源!!!!!!
}
}
你的代码没有释放通用对话框资源,在程序运行期间,这些对话框被CLR认为你一直在使用而实际没有用.你的代码也没有释放图象资源,只要没有释放的资源被征用时,就会警告内存不足,请参看下面的代码修改!
private void openFileDialog1_FileOk(object sender, System.ComponentModel.CancelEventArgs e)
{
FileNames = openFileDialog1.FileNames;
panel7.Invalidate();
openFileDialog1.Dispose();// 请添加
}
private void panel7_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
{
if (FileNames == null)
return;
if (FileNames.Length == 0)
return;
Graphics graphics = e.Graphics;
int cx = 2;
int cy = 2;
int Width = 60;
int Height = 60;
for (int Index = 0; Index < FileNames.Length; Index ++)
{
Image image= Image.FromFile(FileNames[Index]); graphics.DrawImage(image, cx + (Index % 3) * (Width + cx),
cy + (Index / 3) * (Height + cy), Width, Height);
if(image!=null)
image.Dispose();//确保释放图象资源!!!!!!
}
}
#20
gz!
STUDY!
STUDY!
#21
真高兴 有学到了点东西!哈 谢谢 海天 哈
#22
收藏
#23
gz
#24
收藏
#25
up
#26
hehe
同样的错误
同样的错误
#27
是不是瑞星之类的追着跑,来这怪M$ ..
#28
我从来不用 瑞星
呵呵
MS 也会有问题的
要不然 比尔.改死 也不至于叫 补丁大王 了
呵呵
MS 也会有问题的
要不然 比尔.改死 也不至于叫 补丁大王 了
#29
TO: 飞刀
我换了台机子也不行
是不是 我的 .NET 版本有问题?
我换了台机子也不行
是不是 我的 .NET 版本有问题?
#30
这是一个简单的问题, 相对来说. 我碰到过一个真正的内存漏出的c#问题.
当时,是由于gdi + 对象的new 试用与CollectionBase的问题.
.Net在Gdi+方面还是有一定的问题的. 我想.
当时,是由于gdi + 对象的new 试用与CollectionBase的问题.
.Net在Gdi+方面还是有一定的问题的. 我想.
#31
杀毒!
加内存!
加内存!
#32
问题依旧:
************** 异常文本 **************
System.OutOfMemoryException: 内存不足。
at System.Drawing.Image.FromFile(String filename, Boolean useEmbeddedColorManagement)
at System.Drawing.Image.FromFile(String filename)
at MMSComposer.Form1.panel7_Paint(Object sender, PaintEventArgs e) in d:\mms vasp\mmscomposer\form1.cs:line 957
at System.Windows.Forms.Control.OnPaint(PaintEventArgs e)
at System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e, Int16 layer, Boolean disposeEventArgs)
at System.Windows.Forms.Control.WmPaint(Message& m)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
at System.Windows.Forms.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
************** 异常文本 **************
System.OutOfMemoryException: 内存不足。
at System.Drawing.Image.FromFile(String filename, Boolean useEmbeddedColorManagement)
at System.Drawing.Image.FromFile(String filename)
at MMSComposer.Form1.panel7_Paint(Object sender, PaintEventArgs e) in d:\mms vasp\mmscomposer\form1.cs:line 957
at System.Windows.Forms.Control.OnPaint(PaintEventArgs e)
at System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e, Int16 layer, Boolean disposeEventArgs)
at System.Windows.Forms.Control.WmPaint(Message& m)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
at System.Windows.Forms.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
#33
up
#34
感觉用Dispose 方法没什么效果