HALCON: 对象(object)从声明(declaration)到结束(finalization)

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");

你可以通过在线帮助查看哪些构造函数:

  1. 类的参考手册页并不列出构造函数本身,而是列出它们所基于的操作符。然后,构造函数具有与操作符相同的签名(当然,减去对应于类的输出参数)。
  2. 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对象(在许多情况下相当大)的引用。因此,垃圾收集器可能不会释放这些变量,即使它们不再使用。

因此,您可能需要强制删除(未使用的)对象。有两种方法:

  1. 手动调用垃圾收集器。在匹配的例子中,这是在timer事件的每次处理运行后完成的:

private void Timer_Tick(object sender, System.EventArgs e)

{

  Action();

  GC.Collect();

  GC.WaitForPendingFinalizers();

}

c++应用程序:在托管c++应用程序中调用垃圾收集器的代码是:

GC::Collect();

GC::WaitForPendingFinalizers();

  1. 通过调用Dispose方法手动清除单个对象:

HImage  Image = new HImage("fuse");

...

Image.Dispose();

除了减少内存消耗,手动处理对象的另一个原因是释放资源,例如,关闭与图像采集设备或串行接口的连接。

如果引用的资源要以确定的方式释放,那么包含句柄的HTuple实例也需要被释放。

请注意,HALCON操作符总是为输出参数和返回值创建一个新的对象实例(但不是在修改调用实例的“类构造函数”操作符调用中)。如果变量已经初始化,它的旧内容(以及为它分配的内存)仍然存在,直到垃圾收集器删除它。如果要手动删除它,必须在将对象分配给它之前调用Dispose

转载自:https://blog.csdn.net/liubing8609/article/details/126028281

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值