2015-06-08 119 views
1

我有一个接收两个引用路径作为输入的子。 该子项目是根据第一个项目改变第二个路径的值。 (它添加了用户选择的文件夹)可以认为第一个路径引用是真正的输入,第二个是输出。 (认为​​C:将指针传递给应该由函数修改而不是返回值的东西)如何触发子变量中的值更改事件,该事件引用了可能的更改值?

说我插入根目录,vi将子目录写入第二个路径引用。

"/" -> subvi -> "/subdirectory/" 

这工作正常。

现在我想将这些子VI链上的两个在一起,使用户可以选择一个文件夹结构的两层,就像这样:

"/" -> subvi1 -> "/subdirectory/" -> subvi2 -> "/subdirectory/subsubdirectory/" 

只是要清楚:本是同子VI,二手在子面板中的同一个主vi中两次。

连锁vis不按预期工作。 每个子项都注册第一个路径引用的值更改事件。我这样做的动机是通知任何后续的子实例,其根路径的值发生了变化。

subvi1中进行的更改应该反映在subvi2中,以便subvi2在subvi1中选择的路径上运行。 更改事件不会触发。并没有反映出subvi1的变化。

这是因为我有路径引用作为输入?向他们添加一个值变化事件意味着引用必须改变才能引发它,事实并非如此。如果是这样,如何添加一个更改事件到引用引用的内容而不是引用本身?

我过度使用参考? 我应该只使用路径而不是路径的引用吗?

请看看下面的图片,它显示了如何创建两个子视图并将其推入到子面板中。

code

而且一些更多的信息,我希望这有助于。

每个子视图只是为它接收的第一个路径引用的更改事件添加一个案例。

当通过参考设置您的值时使用值(信令)。这种价值变化会产生价值变化事件。 并通过值(信令)将结果写入第二个参考。 我怀疑这是问题出在哪里,因为它改变了引用内容的值,而不是引用本身。

值更改事件从不执行。

LabVIEW没有引用路径。我假设你是指一个路径控件的引用(它也跟踪你正在谈论的值变化事件)。

好的,我滥用术语。我很抱歉有任何混淆。是的,我的意思是对路径控制的引用。

如果您确实需要将消息作为消息传递(例如,如果您有并行进程),我会建议使用其他机制,比如用户事件,而不是值更改事件。 VC事件可以工作,但它们是为UI使用而设计的。以编程方式使用它们可以使你的代码变得复杂。

我确实需要这个并行,因为我有2个子。这是多么的复杂?我通过了一个即将改变的参考,就是这样。 If the information should go the other way, from main, to subvi, the suggested solution from national instruments is also to pass a reference as can be seen in this tutorial.

你只在登记事件后,已经发生了

我不知道这是如何,因为这两个子VI坚持主。我可以反复点击它们,这应该反复发生变化事件。

+0

它可能会使它更清晰一些,包括你试过的代码片段 – Swinders

回答

0

LabVIEW没有引用路径。我假设你是指一个路径控件的引用(它也跟踪你正在谈论的值变化事件)。我肯定会说直接使用路径会更好。利用LV不需要传递参数来从函数返回多个值的丑陋事件。如果你能做到的话,价值往往会在数据流中更好地工作。如果你确实需要传递消息(例如,如果你有并行进程),我会建议使用其他机制,比如用户事件,而不是值更改事件。 VC事件可以工作,但它们是为UI使用而设计的。以编程方式使用它们可以使你的代码变得复杂。

这就是说,没有代码就不可能确切地说出你的问题是什么,但根据你的描述我最好的猜测是你只在事件发生后才注册,所以它不会被添加到队列中第二个VI,但这只是一个猜测,因为你的描述不是很清楚。

一般来说,对于这些问题来说,更好的地方是NI论坛(如果这对你没有帮助,并且你在那里发布,你肯定会希望包含代码)。

作为最后一点,您没有注册参考值的更改。将引用连接到寄存器节点将始终为您提供注册参考点(在此情况下为路径控制)的对象事件的选项。

+0

谢谢你,我比其他任何论坛都更喜欢SO。我编辑了我的问题以提供更多信息。请您详细说明您提到的“注册节点”是什么?它是否可以在我链接的教程中看到注册节点?谢谢 – max

+0

寄存器节点的确确实实施了这个诀窍,为什么注册动态地不同于“静态地”,正如我之前做的那样?如果可能,请详细说明差异吗?谢谢 – max

+0

SO对某些事情很好。询问这些类型的LV问题不是其中之一。这里有一些原因: 1.这里没有太多的LV用户。 2.如果没有它,您不能进行评论,无论是保存编辑还是进食换行。 3.你不能附上实际的代码。 4.这种类型的事情通常需要讨论,这是明确的SO没有设计做。 5.编辑现有内容对于某些事情是很好的,但是当你试图解决这种问题的时候非常糟糕。 总之,我会建议使用NI论坛并附上实际的代码。 – Yair

0

使用Value (Signalling)当通过引用设置您的值时。这种价值变化会产生价值变化事件。

然而,总的来说,它似乎对我来说是一个奇怪的架构,虽然没有看到代码和要求很难说。

0

据我所知,你的代码中有一个竞争条件 - 你并行地启动VI,所以没有告诉他们将以什么顺序运行,并且有可能在另一个得到之前更新寄存器。

这是假设它甚至是两个独立的VI,正如你的文字所暗示的。看着你的图像,我会猜想它是相同的VI,在这种情况下,VI不能并行运行,因为你使用的是静态引用,所以即使VI是可重入的,你也会得到相同的实例。如果你只是拿了VI并用不同的名字创建它的副本,我建议你阅读可重入的VI以及如何动态地启动它们。

+0

这是相同的子。它是并行执行的。他们一直在跑,所以没有比赛条件。它们可以重入并且可以工作。我有两个显然独立的子实例。从我的结果中我不得不说这个答案是错误的。 – max

+0

正确。我确信这是行不通的,但是一个快速测试似乎表明它们并行运行,即使预先分配了重入。我不知道为什么我想到你必须创建一个动态参考。无论如何,你仍然可能遇到我谈到的竞争条件,而且没有实际的代码很难说清楚。 – Yair