当前位置:网站首页>HALCON: 对象(object)从声明(declaration)到结束(finalization)
HALCON: 对象(object)从声明(declaration)到结束(finalization)
2022-08-02 13:39:00 【机器视觉001】
HALCON: 对象(object)从声明(declaration)到结束(finalization)
在对象的生命周期中,即从声明到结束,分配和释放的内存数量是不同的。
下面的声明只是声明了类HImage的一个变量,它还没有引用任何对象:
HImage Image1;
在这种状态下,不能使用变量调用操作符;根据编程语言的不同,您甚至可能无法将它用作输出参数(例如,在Visual Basic 2005中)。但是,你可以将图像对象赋值给变量,例如作为操作符的返回值:
Image1 = Framegrabber.GrabImage ();
你也可以在声明变量时初始化它:
HImage Image2 = Framegrabber.GrabImage();
HImage Image3 = null;
注意,您可以使用IsInitialized()方法检查类实例的初始化状态。
构造函数(Constructors)
相反,下面的声明调用了类HImage的“空”构造函数,它创建了一个单元化的类实例:
HImage Image4 = new HImage();
这个类实例可以用来调用类似于构造函数的操作符,比如GrabImage,它会用抓取到的图像来初始化它:
Image4.GrabImage (Framegrabber);
除了空的构造函数,大多数HALCON/.NET类提供一个或多个构造函数,用于基于HALCON操作符初始化所创建的对象。例如,HImage提供了一个基于操作符ReadImage的构造函数:
HImage Image5 = new HImage("fuse");
你可以通过在线帮助查看哪些构造函数:
- 类的参考手册页并不列出构造函数本身,而是列出它们所基于的操作符。然后,构造函数具有与操作符相同的签名(当然,减去对应于类的输出参数)。
- Visual Studio中的在线帮助列出了构造函数,但没有列出它们所基于的操作符。
终结器(Finalizers)
.net内存管理背后的主要思想是程序员不用担心它,让垃圾收集器删除所有不再使用的对象。HALCON /.NET完全遵循这一理念,为所有类提供了相应的终结器,这样即使是非托管资源,例如连接到图像采集设备,也能正确和自动地删除。
对于大多数类,终结器自动调用合适的操作符,比如CloseFramegrabber()来释放资源。调用哪个操作符在类的参考手册页中列出(例如,请参阅HFramegrabber的条目)。这个操作符不能通过类调用,可以在相应的参考手册条目中看到:
static void HOperatorSet.CloseFramegrabber(HTuple acqHandle)
void HFramegrabber.CloseFramegrabber()
您甚至不需要调用这样的操作符,例如,如果您想重新打开具有不同参数的连接,因为这是自动完成的。
当使用正常的类时,如HFramegrabber,请不要通过HOperatorSet调用Close 或 Clear操作符。
垃圾收集(Garbage Collection)
如上所述,.net的原理是让垃圾收集器删除不使用的对象。但是,由于垃圾收集器只是不时地删除不使用的对象,因此在此期间使用的内存会增加。
更重要的是,对于垃圾收集器来说,HALCON的iconic变量(images, regions……)似乎相当“小”,因为它们只包含对数据库中iconic对象(在许多情况下相当大)的引用。因此,垃圾收集器可能不会释放这些变量,即使它们不再使用。
因此,您可能需要强制删除(未使用的)对象。有两种方法:
- 手动调用垃圾收集器。在匹配的例子中,这是在timer事件的每次处理运行后完成的:
private void Timer_Tick(object sender, System.EventArgs e)
{
Action();
GC.Collect();
GC.WaitForPendingFinalizers();
}
c++应用程序:在托管c++应用程序中调用垃圾收集器的代码是:
GC::Collect();
GC::WaitForPendingFinalizers();
- 通过调用Dispose方法手动清除单个对象:
HImage Image = new HImage("fuse");
...
Image.Dispose();
除了减少内存消耗,手动处理对象的另一个原因是释放资源,例如,关闭与图像采集设备或串行接口的连接。
如果引用的资源要以确定的方式释放,那么包含句柄的HTuple实例也需要被释放。
请注意,HALCON操作符总是为输出参数和返回值创建一个新的对象实例(但不是在修改调用实例的“类构造函数”操作符调用中)。如果变量已经初始化,它的旧内容(以及为它分配的内存)仍然存在,直到垃圾收集器删除它。如果要手动删除它,必须在将对象分配给它之前调用Dispose。
边栏推荐
猜你喜欢
Enterprise Network Planning Based on Huawei eNSP
暑假集训-week2图论
k8s之KubeSphere部署有状态数据库中间件服务 mysql、redis、mongo
乐心湖‘s Blog——MySQL入门到精通 —— 囊括 MySQL 入门 以及 SQL 语句优化 —— 索引原理 —— 性能分析 —— 存储引擎特点以及选择 —— 面试题
路由-Tab切换页面
Introduction to Scala Basic Syntax (3) Various Operators in Scala
移动端适配,华为浏览器底色无法正常显示
【C语言】手撕循环结构 ——do...while语句及循环练习题(1)
多个驻外使领馆发提醒 事关赴华出行、人身财产安全
C语言提高篇(三)
随机推荐
.Net 5.0快速上手 Redis
Scala基础语法入门(三)Scala中的各种运算符
【C语言】剖析函数递归(1)
使用Amazon SageMaker 构建基于自然语言处理的文本摘要应用
CSDN(成长一夏竞赛)- 最大数
【C语言】剖析函数递归(3)
【C语言】细品分支结构——switch语句
k8s之KubeSphere部署有状态数据库中间件服务 mysql、redis、mongo
CVE-2020-27986(Sonarqube敏感信息泄漏) 漏洞修复
Closures in JS
eclipse连接数据库后插入数据报错null
SQL函数 UPPER
Enterprise Network Planning Based on Huawei eNSP
tinymce-plugins
你知道图论的spfa吗?
JS中的闭包
数值的整数次方
拯救流浪猫 | 「喵先锋」系列数字版权盲盒明日开抢
wait() ,notify(),notifyAll()以及wait()与sleep()比较
【C语言】虐打循环练习题(2)