labview移位寄存器(使用LabVIEW数据值引用实现单例模式)

labview移位寄存器
 惊   蛰 








单例模式是一种常用的软件设计模式,其定义是单例对象的类只能允许一个实例存在。许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。比如在某个服务器程序中,该服务器的配置信息存放在一个文件里,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。这种方式简化了在复杂环境下的配置管理。

那些年踩过的坑

    如果系统的学习设计模式,那你的第一个设计模式一定是单例模式。
    使用C++和python实现单例模式早就已经完成,C++有指针,可以直接访问内存中的变量。Python直接提供了对单例模式的支持。但在LabVIEW就遇到了难关,一直没有实现。原因就在于,没有找到LabVIEW的“指针”。
    下面是我最初版的LabVIEW单例模式,我曾以为这就成功了,但现实打了脸:

    借用了功能全局变量的概念,使用“首次调用”vi作为分支条件。每次调用这个功能全局变量的时候,都是从移位寄存器获得类的对象返回。
    乍一看好像没有问题,类只实例化了一次。
    但事实上每次从移位寄存器返回又发生了一次copy,所以最终返回的根本不是第一次实例化的对象,而是拷贝之后的副本。该对象在外部发生的属性改变,根本不能同步到功能全局变量的移位寄存器中。

数据值引用版单例模式

    LabVIEW的数据值引用帮我解决了这个问题。
    其实之前也了解过数据值引用,但一直没有真正做过。最近编写数据值引用的内部培训PPT,才详细了解到它。
    数据值引用类似于C语言的指针,但功能肯定没有指针那么强大。它可以根据任何一种LabVIEW支持的数据类型的实例化数据,创建一个引用。通过该引用可以直接访问该数据在内存中的位置。

    上图为修改过后的单例模式,其它都没有改变,唯一改变的就是移位寄存器中的值,从类的实例化对象改为了类的实例化对象的引用。而且,通过这个引用可以直接访问该对象的公开方法,而不需要从内存中先取值。

    从上图可以看出,先通过get Human Ref.vi获取了类的实例化对象的引用,然后修改该对象的属性值。重新从get Human Ref.vi中获取类的实例化对象的引用,再访问对象的属性值,发现成功获取到了修改后的属性值,所以第一次和第二次访问的是同一个对象,即同一个内存地址。
    有一点需要注意,因为该引用是在类的方法中创建,所以也必须在类的方法中删除,不可以在类外部删除。

李鲲
使用“删除数据值引用“创建删除方法进行删除是么?
是的,通过这个方法删除引用。但是如果是在类的方法中创建了这个引用,就必须也在这个类的方法中删除这个引用。在类的外部不能直接删除引用。
喻功辉

  清风朗月,不期而遇
  扫描二维码关注我们吧

华 穗 科 技

labview移位寄存器相关文章

版权声明