我试图找出如何查找我在LabVIEW上创建的对象是否已关闭。
如果此事件被调用两次,则此逻辑将失败。 在调用一次相机参考被关闭但在第二次尝试时 Camera :: IsOpen被调用。此时未引用Camera实例。 然后它会抛出异常。
在调用Camera :: IsOpen之前我想检查Camera对象以确保它不是 NULL 。
有办法检查吗?
请注意,Library是一个静态函数,因此不必实例化,但必须实例化Camera才能调用其方法和属性。
由于
答案 0 :(得分:4)
要检查首先从未打开的引用句柄,可以比较Not A Refnum常量的相等性。不同的数据类型有不同的引用句柄常量。要为特定数据类型创建任何Not A Refnum常量,请右键单击导线并选择Create>>不变。新创建的常量的值始终为Not A Refnum。 " Not A Refnum"调色板中的常量严重错误,应该从调色板中删除,因为它不能代表所有数据类型。
要检查您曾经打开的引用句柄是否已关闭,只需在该引用句柄上调用一个函数即可。如果它返回错误,请检查错误是否为错误代码1.如果是,则引用该引用句柄无效。
说真的,以上是检查枪膛是否已关闭的最佳方法。理论上,你可以使用Not A Number / Refnum / Path功能,但这通常会导致竞争条件!我已经看到很多程序犯了这个错误:"哦,我会检查引用句柄是否有效,然后,如果它是有效的,我会继续采取依赖于那个refnum,我不打扰检查错误,因为我已经知道引用是有效的!"问题是,在您检查引用句柄是否有效之后,在您开始执行操作之前,另一个并行线程可能会关闭引用!然后你就被软管了。这个问题非常糟糕,因为竞争条件是一个非常小的窗口,所以它通常只能在非常昂贵的项目中已经部署到现场的非常昂贵的硬件上复制。 ;-)
鉴于上述情况," Not A Number / Refnum / Path"函数通常只能与refnums一起用作状态INDICATOR。换句话说,您可以将其用于调试和显示目的,但不要养成让代码根据其结果做出决策的习惯。
所以在你的情况下,只要无条件地打电话关闭 - 不要检查相机是否打开......只需打电话关闭。如果您没有收到错误,那么它就会被打开。
答案 1 :(得分:-1)
将其与Not a Refnum
常量进行比较。
如果.NET库在您调用Close
时没有使其引用无效,则之后将该线的值设置为非Refnum 。