开启左侧

如何在C++/C#中进行Halcon对象的垃圾回收?

[复制链接]
Criss 发表于 2022-11-24 21:32:32 | 显示全部楼层 |阅读模式
由于.NET 中是让垃圾收集器Garbage Collector (简称GC)删除未使用的对象。但是,由于GC只是不时地删除未使用的对象,因此同时使用的内存会增加。更重要的是,对于GC来说,HALCON 的标志性变量(图像、区域……)似乎相当“小”,因为它们只包含对(在许多情况下相当大)标志性对象的引用数据库。因此,GC可能不会释放这些变量,即使它们不再被使用。因此,您可能需要强制删除(未使用的)对象。有两种方法可以做到这一点:
第一种方式:手动调用GC
比如每次处理运行后在计时器事件中完成:
  1. private void Timer_Tick(object sender, System.EventArgs e)
  2. {
  3.   Action();
  4.   GC.Collect();
  5.   GC.WaitForPendingFinalizers();
  6. }
复制代码
在托管 C++ 应用程序中调用GC的代码是:
  1. GC::Collect();
  2. GC::WaitForPendingFinalizers();
复制代码


第二种方式:通过调用Dispose()方法手动处理单个对象
  1. HImage  Image = new HImage("fuse");
  2.   ...
  3. Image.Dispose();
复制代码

除了减少内存消耗,手动处理对象的另一个原因是释放资源,例如,关闭与图像采集设备或串行接口的连接。
如果要以确定的方式释放引用的资源,则还需要释放包含句柄的 HTuple实例。
请注意,HALCON 运算符总是为输出参数和返回值创建一个新的对象实例(但不是在修改调用实例的“类构造函数”运算符调用中)。如果变量已经初始化,它的旧内容(以及为其分配的内存)仍然存在,直到GC将其删除。如果你想手动删除它,你必须在给它分配一个对象之前调用Dispose 。
51halcon2 发表于 2022-12-24 13:47:57 | 显示全部楼层
学到了
hinet64 发表于 2022-12-25 18:44:57 | 显示全部楼层
学习了~谢谢分享
jlee323 发表于 2022-12-26 09:46:16 | 显示全部楼层
第二种方式常用,另外还要注意相机取图指针的资源回收
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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