相关代码如下
tembmp = new Bitmap(templatebmp);
g = Graphics.FromImage(tembmp);
((PictureBox)this.Controls["pictureBox"]).Image = Image.FromHbitmap(tembmp.GetHbitmap());
g.Dispose();
tembmp.Dispose();就是这些,每执行一次,就会吃掉一张图片的内存,我曾试了每次dispose PictureBox后再生成PictureBox,但是没有效果
求高手解惑。
tembmp = new Bitmap(templatebmp);
g = Graphics.FromImage(tembmp);
((PictureBox)this.Controls["pictureBox"]).Image = Image.FromHbitmap(tembmp.GetHbitmap());
g.Dispose();
tembmp.Dispose();就是这些,每执行一次,就会吃掉一张图片的内存,我曾试了每次dispose PictureBox后再生成PictureBox,但是没有效果
求高手解惑。
Using G as graphics=graphics.....
.....
End Using
End Using
用dylike的写法没有效果
参考xiehuanxie老师的提醒加入如下代码
if (((PictureBox)this.Controls["pictureBox" ]).Image != null)
{
((PictureBox)this.Controls["pictureBox"]).Image.Dispose();
}
吃内存的速度降低了一半,效果明显,但另一半丢在哪里了呢??望高手再帮忙分析一下
我加上
if (((PictureBox)this.Controls["pictureBox" ]).Image != null)
{
((PictureBox)this.Controls["pictureBox"]).Image.Dispose();
}这几句后,执行一次,内存占用变成每次6M左右
不相信的同学可以自己试一下,
如果每次6M,那我执行100次以上后程序不就变成个宠然大物了??
请达人指点
测试代码如下,感兴趣的同学调试一下
类内声明:
Bitmap tembmp = null;
Graphics g = null;
Bitmap templatebmp = null;
PictureBox tempic = null;
在Form Load事件中
templatebmp = new Bitmap(1200,900);
Graphics gr = Graphics.FromImage(templatebmp);
在这里,我预画了很多东西
tempic = new PictureBox();
tempic.Name = "pictureBox";
tempic.Location = new System.Drawing.Point(10, 10);
tempic.Size = templatebmp .Size;
tempic.TabStop = false;
this.Controls.Add(tempic);在执行函数里
using(tembmp = new Bitmap(templatebmp))
{
using (g = Graphics.FromImage(tembmp))
{
g.DrawString(string.Format("对号码'{0}'的频率分析",i), tft, Brushes.White, 0, 0);
g.DrawLines(cpen1, p16);
g.DrawLines(cpen2, p48);
g.DrawLines(cpen3, p90);
g.DrawLines(cpen4, p360); if (((PictureBox)this.Controls["pictureBox" ]).Image != null)
{
((PictureBox)this.Controls["pictureBox" ]).Image.Dispose();
}
((PictureBox)this.Controls["pictureBox" + i]).Image = Image.FromHbitmap(tembmp.GetHbitmap()); }
}
GC.Collect();应该会立竿见影的。
这个我昨天就试过,按理说好像是可以,但改后运行时就会出现参数错误中断,最后卡在
Application.Run(new form());这里
这个也试了
if (((PictureBox)this.Controls["pictureBox" ]).Image != null)
{
((PictureBox)this.Controls["pictureBox" ]).Image.Dispose();
}
GC.Collect();
((PictureBox)this.Controls["pictureBox" ]).Image = Image.FromHbitmap(tembmp.GetHbitmap());
内存占用还是以5M-6M的速度增加,
上面我的
((PictureBox)this.Controls["pictureBox" +i]).Image = Image.FromHbitmap(tembmp.GetHbitmap());
多个 +i,原程序是要刷新一组图片的,测试时去掉
因为是PictureBox,要更新的是图片,PictureBox如果被清掉重画,那么界面会有一个很大的闪烁,如果固定PictureBox,只更新图片,才能出来像股票行情界面那样好像线条在走的效果。
--------------------------------------------------------------------------------FromHbitmap 方法生成 GDI 位图的一个副本,因此创建新的 Image 后立即使用 GDIDeleteObject 方法,您可以释放传入的 GDI 位图。
相关代码改为如下:
IntPtr temipr = tembmp.GetHbitmap();
((PictureBox)panel1.Controls["pictureBox" + i]).Image = Image.FromHbitmap(temipr);
DeleteObject(temipr);问题消除!!
大大长了见识呀。
向您致敬!
一不小心买了几百个点的,实验没有什么问题,谁知投用后才发现是个不成熟的产品,
我们的机器是要24*7*365一直运行的,可是只用了三天就发现CPU占用率竟达到了70%,大概以前他们是给监控员工电脑安装的吧,没想在在线运行的系统里不断蚕食CPU资源,最后不可收拾。