我有一个subvi,它接收两个对路径的引用作为输入。subvi会执行其操作并根据第一个路径更改第二个路径的值。(它添加了用户选择的文件夹)可以将第一个路径引用视为真正的输入,而将第二个路径视为输出。(想想C:将指针传递给应该由函数修改的内容,而不是返回值)
假设我插入了一个根目录,vi将一个子目录写入第二个路径引用。
"/" -> subvi -> "/subdirectory/"
这很好。
现在,我要将这些子视图中的两个链接在一起,以便用户可以选择文件夹结构的两层,如下所示:
"/" -> subvi1 -> "/subdirectory/" -> subvi2 -> "/subdirectory/subsubdirectory/"
需要明确的是:这是同一个子vi,在子面板的同一主vi中使用了两次。
链锯无法正常工作。每个子vivi记录第一个路径引用的值更改事件。我这样做的动机是通知子vi的任何后续实例其根路径的值已更改。
在subvi1中所做的更改应反映在subvi2中,以便subvi2在subvi1中选择的路径上运行。更改事件永远不会触发。并且subvi1中的更改不会得到反映。
这是因为我将路径引用作为输入吗?向它们添加值更改事件将意味着必须更改引用才能将其触发,事实并非如此。如果是这样,如何将更改事件添加到引用所引用的内容而不是引用本身?
我是否通过使用参考使这个问题复杂化了?我应该只使用路径而不是对路径的引用吗?
请看下图,它显示了如何创建两个子视图并将其推入子面板。
还有更多信息,希望对您有所帮助。
每个子vi只是为其接收的第一个路径引用的change事件添加一个案例。
通过参考设置您的值时,请使用“值(签名)”。值的这种更改将生成一个值更改事件。并通过value(signalling)将其结果写入第二个引用。我怀疑这就是问题所在,因为它会更改所引用内容的值,而不是引用本身的值。
值更改事件永远不会执行。
LabVIEW没有引用路径。我假设您的意思是对路径控件的引用(该控件还会跟踪您正在谈论的值更改事件)。
好吧,我在滥用术语。对于任何混乱,我深表歉意。是的,我的意思是对路径控件的引用。
如果确实需要将事物作为消息传递(例如,如果您具有并行进程),则建议使用其他机制,例如用户事件,而不是值更改事件。VC事件可以工作,但是它们是为UI使用而设计的。以编程方式使用它们会使您的代码混乱。
我确实需要并行处理,因为我有2个subvis。这是如何令人费解的?我传递了将要更改的内容的参考,仅此而已。如果信息应该从主要到次要走另一条路,那么国家仪器建议的解决方案也应通过参考,如本教程所示。
您只在事件发生后才注册
我不确定这怎么可能,因为两个subvi都保留在main中。我可以反复单击它们,这应该会反复触发更改事件。
LabVIEW没有引用路径。我假设您的意思是对路径控件的引用(该控件还会跟踪您正在谈论的值更改事件)。我肯定会说直接使用路径会更好。利用LV不需要传递引用以从函数返回多个值的丑陋技巧这一事实。如果可以的话,按值倾向于在数据流中更好地工作。如果确实需要将事物作为消息传递(例如,如果您具有并行进程),则建议使用其他机制,例如用户事件,而不是值更改事件。VC事件可以工作,但是它们是为UI使用而设计的。以编程方式使用它们会使您的代码混乱。
就是说,没有代码,就不可能确切地说出问题所在,但是根据您的描述,我的最佳猜测是,您只是在事件发生后才注册该事件,因此不会将其添加到第二个VI的队列中,但这只是一个猜测,因为您的描述不是很清楚。
通常,NI论坛是解决这些问题的一个好地方(如果您对此无济于事,请务必在其中添加代码)。
最后一点,您不是要注册参考值的更改。将引用链接到注册节点将始终为您提供用于为引用所指向的对象的事件进行注册的选项(在这种情况下为路径控件)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句