中国设计秀欢迎投稿
中国品牌形像设计网
平面设计 画册 VI欣赏 包装 CG-插画 搜索 个人网页 Alexa排名 CSS 建站资源 下载专区 JS特效 品牌服装 服装院校 专题欣赏 SEO 图标欣赏 专题
深圳网站建设 广州网站设计 域名注册 上海网站建设 虚拟主机 广州网站建设 广州网页设计 签名设计 虚拟主机 域名注册 品牌形象设计 设计联盟
求创科技
上海网麒科技
中国福网
中国设计秀
亿恩科技
中国设计秀
中国设计秀
当前位置:网络学院首页 >> 编程开发 >> asp >> WinCE平台下C#引用API(GDI)里面关注内存条泄漏

WinCE平台下C#引用API(GDI)里面关注内存条泄漏

来源:中国设计秀    作者:    点击:18     加入收藏    发表评论
0
顶一下
中资源

由于C#精简框架集绘图函数不支持圆角矩形,所以引用了相关的API。

[DllImport("\\windows\\coredll.dll", EntryPoint = "RoundRect")]

private static extern int CeRoundRect(IntPtr hdc,

int X1, int Y1, int X2, int Y2, int X3, int Y3);

这是有内存泄漏的源码:

public static int RoundRect(Graphics e, Pen pen, SolidBrush brush,

int X1, int Y1, int X2, int Y2, int X3, int Y3)

{        

IntPtr hpen;

IntPtr hbrush;

if(pen!=null)

{

hpen = CreatePen((DashStyle.Solid == pen.DashStyle) ? 0 : 1,

(int)pen.Width, SetRGB(pen.Color.R, pen.Color.G, pen.Color.B)); //创建GDI画笔 

}

else

{

hpen = GetStockObject(8);      //空画笔

}         

if (brush!= null)

{

hbrush = CreateSolidBrush(SetRGB(brush.Color.R, brush.Color.G, brush.Color.B));

//brush.Color.ToArgb());

}

else

{

hbrush = GetStockObject(5);

}

//pen.Dispose();

//brush.Dispose();

IntPtr hdc = e.GetHdc();

//---------------------  

SelectObject(hdc, hbrush);

SelectObject(hdc, hpen);

int intRet=RoundRect(hdc, X1, Y1, X2,Y2, X3, Y3);

DeleteObject(hbrush);

DeleteObject(hpen);

//---------------------

e.ReleaseHdc(hdc);

return intRet;

}

这是没有问题的源码:

public static int RoundRect(Graphics e,

Pen pen, SolidBrush brush, int X1, int Y1, int X2,

int Y2, int X3, int Y3)

{        

IntPtr hpen,old_pen;

IntPtr hbrush, old_brush;

if(pen!=null)

{

hpen = CreatePen((DashStyle.Solid == pen.DashStyle) ? 0 : 1,

(int)pen.Width, SetRGB(pen.Color.R, pen.Color.G, pen.Color.B));     

//创建GDI画笔 

}

else

{

hpen = GetStockObject(8);      //空画笔

}         

if (brush!= null)

{

hbrush = CreateSolidBrush(SetRGB(brush.Color.R,

brush.Color.G, brush.Color.B)); //brush.Color.ToArgb());

}

else

{

hbrush = GetStockObject(5);

}

//pen.Dispose();

//brush.Dispose();

IntPtr hdc = e.GetHdc();

//---------------------  

old_brush=SelectObject(hdc, hbrush);

old_pen=SelectObject(hdc, hpen);



int intRet=RoundRect(hdc, X1, Y1, X2,Y2, X3, Y3);

SelectObject(hdc, old_brush);

SelectObject(hdc, old_pen);

DeleteObject(hbrush);

DeleteObject(hpen);

//---------------------

e.ReleaseHdc(hdc);

return intRet;

}

看出代码的区别来了没有?泄漏的原因其实很简单,就是没有重新选入旧的画笔画刷。同样的程序(当然PC端的API库是GDI32)在上位机Window XP平台上没有什么问题(测试大约3天以上),而在WinCE平台确非常明显,大约1~3个小时(视圆角矩形绘图的多寡而定),该程序就会内存耗尽而死。

2007-09-18 10:02:00    出处:
热点文章/相关文章
网站地图 | 关于我们 | 联系我们 | 网站建设 | 广告服务 | 版权声明 | 免责声明 | 网站公告 | 友情链接 | 留言 | 旧版入口