• 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的原理是让垃圾收集器删除不使用的对象。但是,由于垃圾收集器只是不时地删除不使用的对象,因此在此期间使用的内存会增加。

    更重要的是,对于垃圾收集器来说,HALCONiconic变量(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

  • 相关阅读:
    前端开发常用技术工具网址导航汇总
    MYSQL------从概述到DQL
    Go实现CORS(跨域)
    java特种兵读书笔记(4-2)——java通信之IO与内存
    Shell编程之免交互
    dubbo 搞懂配置中心、元数据中心
    基于NUXT.JS搭建一款VUE版SSR前端框架(解决SPA应用的SEO优化优化问题)
    Rocky Linux 运维工具yum
    JavaScript基础:数据类型
    “2023中国数字化服务之选”榜单发布,谷器数据荣耀登榜!
  • 原文地址:https://blog.csdn.net/liubing8609/article/details/126028281