请问C#大家,是.NET还是系统内存泄漏或是什么原因?一用DrawImage方法,一起产生页面错误.

lsx_workroom 2015-11-17 01:10:50
只要使用DrawImage方法,就会导致页面错误.
而且根据DrawImage画图的大小,页面错误越来越大.用户使用一晚上软件,只要不退出软件,就会产生2亿多条页面错误.
致使软件运行速度变慢.
找过很多资料,也没明白什么原因.
写了下面的测试代码,发现就出在DrawImage上.
如果再解决不了,只能用GDI绘图了,Bitblt就没问题.把GDI+替换成GDI,工作量太大.
还求原因与解决方法.

    public partial class Form1 : Form
{
Bitmap m_Bitmap = null;
Bitmap m_Bitmap2 = null;
Graphics m_grap = null;
Graphics m_windowG = null;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
m_Bitmap = new Bitmap(this.Width, this.Height);
m_Bitmap2 = new Bitmap(this.Width, this.Height);
m_grap = Graphics.FromImage(m_Bitmap);
m_grap.Clear(Color.Blue);
m_windowG = this.CreateGraphics();
}
private void button1_Click(object sender, EventArgs e)
{
//m_grap.DrawImage(m_Bitmap2, 0, 0);
m_windowG.DrawImage(m_Bitmap, 0, 0);
}


...全文
247 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_32892001 2017-02-15
  • 打赏
  • 举报
回复
引用 15 楼 github_22161131 的回复:
在你之前的帖子里我回过了,GDI+使用了 memory mapped file,mmf 就是使用 page fault 向用户进程空间映射内存的,所以只要使用GDI+,就可能会 page fault(不过这里的 soft page fault 并不涉及磁盘 I/O )。试验可以发现这个例子的 page fault 数量精确等于目标Graphics来源的长*宽*4 / 4K,显然和你之前的频繁创建Bitmap时的现象一样,说明GDI+在DrawImage的时候也会使用 mmf 来映射内存。这问题除非使用其它绘图方式,否则无法解决。
大神你好,我是一个遇到问题的小青年,我现在遇到一个奇葩的问题,当我开启HTTP Analyzer的时候,我的程序是可以正常爬取到网页和数据,但我关闭了就会出现{System.Net.WebException: 基础连接已经关闭: 发送时发生错误。 ---> System.IO.IOException: 由于意外的数据包格式,握手失败。如果看到并且有时间可以帮忙解决下吗?我QQ是:79612086,可以给酬劳的,这问题困扰我很多天了,一直找不到解决方法
lsx_workroom 2015-11-19
  • 打赏
  • 举报
回复
引用 15 楼 github_22161131 的回复:
在你之前的帖子里我回过了,GDI+使用了 memory mapped file,mmf 就是使用 page fault 向用户进程空间映射内存的,所以只要使用GDI+,就可能会 page fault(不过这里的 soft page fault 并不涉及磁盘 I/O )。试验可以发现这个例子的 page fault 数量精确等于目标Graphics来源的长*宽*4 / 4K,显然和你之前的频繁创建Bitmap时的现象一样,说明GDI+在DrawImage的时候也会使用 mmf 来映射内存。这问题除非使用其它绘图方式,否则无法解决。
我了解了一下MMF,似乎原因就是你说的这个. 非常感谢,这就是这个帖子的答案. 大神知识面够宽的.
winnowc 2015-11-17
  • 打赏
  • 举报
回复
在你之前的帖子里我回过了,GDI+使用了 memory mapped file,mmf 就是使用 page fault 向用户进程空间映射内存的,所以只要使用GDI+,就可能会 page fault(不过这里的 soft page fault 并不涉及磁盘 I/O )。试验可以发现这个例子的 page fault 数量精确等于目标Graphics来源的长*宽*4 / 4K,显然和你之前的频繁创建Bitmap时的现象一样,说明GDI+在DrawImage的时候也会使用 mmf 来映射内存。这问题除非使用其它绘图方式,否则无法解决。
lsx_workroom 2015-11-17
  • 打赏
  • 举报
回复
引用 12 楼 shingoscar 的回复:
先搞搞清楚什么叫页面错误,软件运行慢怪到这个上面来了。。 https://en.wikipedia.org/wiki/Page_fault
感谢回复.我了解页面错误的原因. 经过测试,软件的确会因为页面错误增大而变慢.
lsx_workroom 2015-11-17
  • 打赏
  • 举报
回复
引用 11 楼 dongxinxi 的回复:
所谓内存错误是指,当程序需要访问内存时,待访问的地址不再物理内存中,需要换页将虚拟内存页换到物理内存中。 页面错误增量大,会导致运行效率差,赃页多。 按需创建试试

        private void button1_Click(object sender, EventArgs e)
        {
             using(var graphics = this.CreateGraphics())
            {
            //m_grap.DrawImage(m_Bitmap2, 0, 0);
            graphics.DrawImage(m_Bitmap, 0, 0);
           }
        }
感谢回复.试了,但问题依旧.
Poopaye 2015-11-17
  • 打赏
  • 举报
回复
先搞搞清楚什么叫页面错误,软件运行慢怪到这个上面来了。。 https://en.wikipedia.org/wiki/Page_fault
  • 打赏
  • 举报
回复
所谓内存错误是指,当程序需要访问内存时,待访问的地址不再物理内存中,需要换页将虚拟内存页换到物理内存中。 页面错误增量大,会导致运行效率差,赃页多。 按需创建试试

        private void button1_Click(object sender, EventArgs e)
        {
             using(var graphics = this.CreateGraphics())
            {
            //m_grap.DrawImage(m_Bitmap2, 0, 0);
            graphics.DrawImage(m_Bitmap, 0, 0);
           }
        }
lsx_workroom 2015-11-17
  • 打赏
  • 举报
回复
感谢回复:
测试代码在这里:http://www.bj-jinke.com/q005.rar

页面错误及页面错误增量,不断在增加.
真不知道原因在哪.
lsx_workroom 2015-11-17
  • 打赏
  • 举报
回复
引用 8 楼 crystal_lz 的回复:
[quote=引用 6 楼 lsx_workroom 的回复:]
[quote=引用 4 楼 crystal_lz 的回复:]
从.你.贴.出.来.的.代.码.上.来.看 我.实.在.是.看.不.出 哪.里.有问题 难道那程序放在哪里 一个晚上 就自己.蹦了?还是说 用户在哪里点了一个晚.上的 button1 ?。
你确定 用.户 用.的.就.是.你.贴.出.来.的那个东西?。。。。


上面的代码,是一个简单,干净的代码.就纯测试用.发现的页面错误不段的增加.
实际软件是,回吐播放软件,用DrawImage不断的绘图.
一晚上发现几亿的页面错误.

各种测试代码,发现是DrawImage的原因.所以做了上面的一段代码.[/quote]
既然你这么肯定为何 不让你这个精简版的代码 跑一个晚上试试 看看?。。。[/quote]

引用 8 楼 crystal_lz 的回复:
[quote=引用 6 楼 lsx_workroom 的回复:]
[quote=引用 4 楼 crystal_lz 的回复:]
从.你.贴.出.来.的.代.码.上.来.看 我.实.在.是.看.不.出 哪.里.有问题 难道那程序放在哪里 一个晚上 就自己.蹦了?还是说 用户在哪里点了一个晚.上的 button1 ?。
你确定 用.户 用.的.就.是.你.贴.出.来.的那个东西?。。。。


上面的代码,是一个简单,干净的代码.就纯测试用.发现的页面错误不段的增加.
实际软件是,回吐播放软件,用DrawImage不断的绘图.
一晚上发现几亿的页面错误.

各种测试代码,发现是DrawImage的原因.所以做了上面的一段代码.[/quote]
既然你这么肯定为何 不让你这个精简版的代码 跑一个晚上试试 看看?。。。[/quote]

感谢回复:
测试代码在这里:http://www.bj-jinke.com/q005.rar

页面错误及页面错误增量,不断在增加.
真不知道原因在哪.
crystal_lz 2015-11-17
  • 打赏
  • 举报
回复
引用 6 楼 lsx_workroom 的回复:
[quote=引用 4 楼 crystal_lz 的回复:] 从.你.贴.出.来.的.代.码.上.来.看 我.实.在.是.看.不.出 哪.里.有问题 难道那程序放在哪里 一个晚上 就自己.蹦了?还是说 用户在哪里点了一个晚.上的 button1 ?。 你确定 用.户 用.的.就.是.你.贴.出.来.的那个东西?。。。。
上面的代码,是一个简单,干净的代码.就纯测试用.发现的页面错误不段的增加. 实际软件是,回吐播放软件,用DrawImage不断的绘图. 一晚上发现几亿的页面错误. 各种测试代码,发现是DrawImage的原因.所以做了上面的一段代码.[/quote] 既然你这么肯定为何 不让你这个精简版的代码 跑一个晚上试试 看看?。。。
xdashewan 2015-11-17
  • 打赏
  • 举报
回复
关闭嘛就是dispose方法,你可以试下每次点击时创建,用完了就关
lsx_workroom 2015-11-17
  • 打赏
  • 举报
回复
引用 4 楼 crystal_lz 的回复:
从.你.贴.出.来.的.代.码.上.来.看 我.实.在.是.看.不.出 哪.里.有问题 难道那程序放在哪里 一个晚上 就自己.蹦了?还是说 用户在哪里点了一个晚.上的 button1 ?。 你确定 用.户 用.的.就.是.你.贴.出.来.的那个东西?。。。。
上面的代码,是一个简单,干净的代码.就纯测试用.发现的页面错误不段的增加. 实际软件是,回吐播放软件,用DrawImage不断的绘图. 一晚上发现几亿的页面错误. 各种测试代码,发现是DrawImage的原因.所以做了上面的一段代码.
lsx_workroom 2015-11-17
  • 打赏
  • 举报
回复
引用 3 楼 wyd1520 的回复:
你自己代码写的有问题。还怪NET。。。 你要记得所有的GDI+ 都要手动销毁。
请问大神,如何手动销毁? 只要点击一下按钮,不让它生成错误页面就好.
crystal_lz 2015-11-17
  • 打赏
  • 举报
回复
从.你.贴.出.来.的.代.码.上.来.看 我.实.在.是.看.不.出 哪.里.有问题 难道那程序放在哪里 一个晚上 就自己.蹦了?还是说 用户在哪里点了一个晚.上的 button1 ?。 你确定 用.户 用.的.就.是.你.贴.出.来.的那个东西?。。。。
本拉灯 2015-11-17
  • 打赏
  • 举报
回复
你自己代码写的有问题。还怪NET。。。 你要记得所有的GDI+ 都要手动销毁。
lsx_workroom 2015-11-17
  • 打赏
  • 举报
回复
引用 1 楼 starfd 的回复:
什么错误呢?
相当于软件内存泄漏,运行时间长,软件会变慢,时间越长,软件越慢.
  • 打赏
  • 举报
回复
什么错误呢?

110,539

社区成员

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

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

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