当前位置:网站首页>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。
边栏推荐
猜你喜欢
随机推荐
好用的php空间,推荐国内三个优质的免费PHP空间[通俗易懂]
二进制中1的个数
requestparam注解接的收的是什么格式(玄机赋注解)
Oracle update误操作单表回滚
面试SQL语句,学会这些就够了!!!
Win11怎么修改关机界面颜色?Win11修改关机界面颜色的方法
Seata分布式事务
WiFi Association&Omnipeek抓包分析
uniapp/小程序 onload方法每次打开页面都执行解读
RESTful 风格(详细介绍 + 案例实现)
SQL函数 TRUNCATE
“多源异构”和“异构同源”定义区分详解「建议收藏」
方正璞华“劳动人事法律自助咨询服务平台”在武汉武昌区投入使用!
JS中的闭包
【C语言】夏日一题 —— 如何判断素数?
"Second Uncle" is popular, do you know the basic elements of "exploding" short videos from the media?
RISC-V instruction format and 6 basic integer instructions
单例模式的七种写法,你都知道吗?
嵌入式系统驱动初级【2】——字符设备驱动基础上_基础框架
els 长条方块变形条件、边界碰撞判定