Halcon视觉之家 - 51Halcon专注于机器视觉技术

 找回密码
 会员注册

QQ登录

只需一步,快速开始

扫一扫,微信登录

查看: 46|回复: 3

[待解决] MFC的并行化Parallel.For含非托管会内存泄露

[复制链接]
  • TA的每日心情
    郁闷
    2021-8-12 10:10
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    4

    主题

    22

    帖子

    29

    积分

    Rank: 1

    积分
    29

    切换助手验证会员

    发表于 2021-10-11 11:34:09 | 显示全部楼层 |阅读模式

    51Halcon诚邀您的加入,专注于机器视觉开发与应用技术,我们一直都在努力!

    您需要 登录 才可以下载或查看,没有帐号?会员注册

    x
    Parallel.For,ref一个自定义结构体(含HObject),内存会逐步增加,代码如下
    [C#] 纯文本查看 复制代码
            private void Test2()
            {
                int sum = 4000000;
                Result_test2 RT = new Result_test2();
                RT.Image = new HObject[sum];
                RT.Image2 = new HObject();
                HOperatorSet.GenEmptyObj(out RT.Image2);
                HOperatorSet.GenRectangle1(out RT.Image2, 100, 100, 2000, 2000);
                Parallel.For(0, sum, (int i) =>
                {
                    _test2(ref RT, i);
                });
    
                RT.Image2.Dispose();
                for (int i = 0; i < sum; i++)
                {
                    RT.Image[i].Dispose();
                }
            }
    
            private void _test2(ref Result_test2 RT, int index)
            {
                RT.Image[index] = new HObject();
                HOperatorSet.GenEmptyObj(out RT.Image[index]);
                HOperatorSet.GenRectangle1(out RT.Image[index], 100, 100, 2000, 2000);
            }
    
            public class Result_test2
            {
                public HObject[] Image;
                public HObject Image2;
            }
    


    读内存代码
    [C#] 纯文本查看 复制代码
            private string GetRam()
            {
                try
                {
                    Process p = Process.GetCurrentProcess();
    
                    if (p != null)
                    {
                        p.Refresh();
                        double usedMemory = 0;
                        string procName = p.ProcessName;
                        using (PerformanceCounter pc = new PerformanceCounter("Process", "Working Set - Private", procName))
                        {
                            usedMemory = pc.NextValue() / 1024.0 / 1024.0;
                        }
                        return $" {usedMemory.ToString("F2")}MB";
                    }
                    return "GetRamEmpty";
    
                }
                catch (Exception ex)
                {
                    return "GetRamError" + ex.Message;
                }
            }
  • TA的每日心情
    郁闷
    2021-8-12 10:10
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    4

    主题

    22

    帖子

    29

    积分

    Rank: 1

    积分
    29

    切换助手验证会员

     楼主| 发表于 2021-10-11 11:37:21 | 显示全部楼层
    循环2000+次Test2(),内存约增加100-300MB
  • TA的每日心情
    郁闷
    2021-8-12 10:10
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    4

    主题

    22

    帖子

    29

    积分

    Rank: 1

    积分
    29

    切换助手验证会员

     楼主| 发表于 2021-10-11 11:48:29 | 显示全部楼层
    此处struct和class都会泄露
    [C#] 纯文本查看 复制代码
    public class Result_test2
    {
        public HObject[] Image;
        public HObject Image2;
    }
  • TA的每日心情
    郁闷
    2021-8-12 10:10
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    4

    主题

    22

    帖子

    29

    积分

    Rank: 1

    积分
    29

    切换助手验证会员

     楼主| 发表于 2021-10-11 11:59:31 | 显示全部楼层
    用的是VS2015,4.0的net框架,halcon12版
    您需要登录后才可以回帖 登录 | 会员注册

    本版积分规则

    视觉培训招生

    建议您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流浏览器浏览本网站

    51Halcon会员技术交流会员技术交流 | 51Halcon官方客服咨询官方客服咨询 | Halcon切换助手使用反馈切换助手使用

    算子查询| 申请友链| 小黑屋| 手机版| Archiver|

    © 2015-2021 51Halcon机器视觉  X3.4  粤ICP备15095995号 粤公网安备44030602000670号

    快速回复 返回顶部 返回列表