WinCE平台下C#引用API(GDI)一个值得警惕的内存泄漏

简介: 由于C#精简框架集绘图函数不支持圆角矩形,所以引用了相关的API。 [DllImport("//windows//coredll.

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

相关文章
|
2月前
|
人工智能 安全 小程序
面向开发者的API平台设计与选型建议【附源码示例】
在软件开发日益模块化的今天,API平台作为连接技术与应用的枢纽,正重塑产品开发方式。它聚合各类能力接口,如支付、AI绘图、图像识别等,助力开发者高效构建系统。本文详解API平台定义、优势、应用场景及选型指南,揭示其如何降低门槛、加速创新,并展望其未来发展趋势。
|
2月前
|
机器学习/深度学习 人工智能 缓存
电商 API 接口:开启全平台商品信息同步新时代
在数字化浪潮下,电商平台激增,消费者跨平台购物成为常态。然而,商品信息分散导致数据不一致、库存混乱等问题。电商 API 接口应运而生,通过标准化数据交换,实现多平台商品信息实时同步,提升运营效率、降低成本、增强用户体验,成为企业数字化转型的关键引擎。
175 0
|
2月前
|
API 开发工具 开发者
【干货满满】电商平台API接口用python调用脚本
这是一个支持淘宝、京东、拼多多、亚马逊等主流电商平台的通用 API 调用 Python 脚本框架,适配 doubao 使用。脚本封装了签名验证、请求处理、异常捕获及限流控制等核心功能,提供统一接口调用方式,便于开发者快速集成与扩展。
|
3月前
|
缓存 监控 API
电商 API 场景中,电商平台将核心完整诊断、分析和优化过程
某头部电商平台通过分阶段性能优化,将核心 API 的 QPS 从 100 提升至 1000。优化涵盖架构、应用、代码和运维四层,包括引入 API 网关、数据库分库分表、多级缓存、异步化改造、序列化优化、容器化弹性伸缩等关键手段,并结合 Jaeger、Prometheus、wrk 等工具进行性能诊断与监控。最终平均响应时间下降 4.7 倍,错误率降低 15 倍,资源使用率显著下降,系统稳定性与吞吐能力大幅提升。
|
2月前
|
人工智能 JSON 算法
抖音电商 API 赋能,抖音平台达人合作数据精准对接
抖音电商API为品牌与达人合作提供精准数据对接,提升匹配效率与营销精准度,助力电商生态智能化升级。
161 1
|
2月前
|
JSON 监控 数据挖掘
抖音电商 API 接口:抖音平台电商活动热度实时监测
抖音电商API接口助力实时监测活动热度,支持商品销量、用户互动等数据获取,帮助商家优化营销策略,提升平台用户体验。
196 0
|
2月前
|
机器学习/深度学习 搜索推荐 数据挖掘
拼多多 API 赋能,拼多多平台新用户获取策略升级
拼多多通过API深度整合,升级新用户获取策略,利用社交裂变、个性化推荐与自动化营销等手段,提升获客效率与用户留存,推动平台持续增长。
134 0
|
2月前
|
JSON 监控 API
京东 API 助力,京东平台促销活动效果实时评估
在电商竞争激烈的背景下,京东平台促销活动成为商家提升销量的重要手段。传统评估方式滞后,难以及时调整策略。京东开放平台提供的API可实现实时数据获取与分析,助力商家高效评估活动效果。通过API,商家能实时追踪流量、监控销售数据、分析转化率与平均订单价值,快速响应市场变化。结合Python代码示例,本文详解如何调用京东API进行数据处理与指标计算,实现自动化监控与策略优化。实际案例显示,使用京东API后,某品牌活动响应时间缩短至秒级,销售额提升20%。京东API推动了从“事后复盘”到“实时优化”的转变,助力商家提升ROI,增强竞争力。
114 0
|
2月前
|
JSON 搜索推荐 数据挖掘
巧用京东 API,精准把握京东平台用户消费偏好
在电商竞争激烈的环境下,精准把握用户消费偏好对提升转化率和优化营销策略至关重要。京东作为国内领先的电商平台,提供丰富的开放 API,支持开发者获取用户行为、订单、浏览等数据。通过调用这些 API,企业可深入分析用户偏好,构建个性化推荐与精准营销方案。本文详细介绍了如何通过京东 API 获取数据、分析用户偏好,并结合实际案例展示其应用场景与效果,助力企业提升运营效率与市场竞争力。
139 0
|
3月前
|
存储 安全 API
亚马逊SP-API入门:海外电商接口调用与国内平台的差异化
亚马逊 SP-API 与国内电商 API 在技术架构、安全机制及开发流程上差异显著。本文对比京东、淘宝等平台,分析接口设计、地域适配、权限管理等核心差异,并结合实战经验提供开发建议,助力开发者高效接入 SP-API,实现全球电商业务拓展。

热门文章

最新文章