RSS
热门关键字:  数据挖掘  人工智能  数据仓库  搜索引擎  数据挖掘导论

WinCE平台下C#引用API(GDI)中注意内存泄漏

来源: 作者: 时间:2007-05-25 点击:

由于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个小时(视圆角矩形绘图的多寡而定),该程序就会内存耗尽而死。

来源链接:http://blog.csdn.net/yefanqiu/archive/2006/12/05/1430411.aspx 数据挖掘研究院

(责任编辑 火凤凰 sunsj@51cto.com  TEL:(010)68476636-8007) 数据挖掘研究院



最新评论共有 0 位网友发表了评论
发表评论
评论内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。
匿名?