LabVIEW使用多个事件结构来处理同一个事件
想根据应用程序的两个不同的状态,用一个事件来触发两个不同的操作。比如,当第一次按下某个按钮时,配置测试。当第二次按下时,测试开始运行。创建了两个不同的事件结构,把每一个结构都配置了一个处理“value changed”的事件,但是它们由数据线或者顺序结构隔开,然后运行VI。当程序运行的时候,整个应用程序会在第一个事件结构上等待,但是当第一个事件发生,代码执行后,第二个事件结构也会同样响应。如果处理的是“mouse down”的事件,第一个事件结构会响应,但是第二个事件结构永远不会响应(即使让这一事件重复多次发生,第二个事件结构永远不会响应)。为什么“value changed"的事件能够导致两个事件结构都响应,但是"mouse down"事件只能够让第一个事件结构响应并且第二个事件结构永远不会响应呢?应当如何创建事件才能使第二个事件结构响应第二个事件的发生呢?
解答: 事件结构和LabVIEW中别的结构和函数不同,它并不是按照LabVIEW中的数据流操作的概念的。“value changed”和“mouse down”事件之间的区别是前者是一个"通报事件"("notify event")而后者是一个"过滤事件"("filter event")。
对于通报事件,当为相同的通报事件配置两个事件结构时,当事件发生时,每一个结构会分别注册该事件,然后他们会被放在事件队列中。然后他们会响应并且处理事件。这个是期待的结果,因为两个事件结构都会响应。然而,第二个事件结构直到数据流到达它才会响应。
对于过滤事件,当为相同的过滤事件配置两个事件结构时,只有第一个事件结构会被注册来处理这个过滤事件,这个是预料中的结果,因为不能够把一个事件过滤两次。永远不要在不同的,独立的事件结构中注册同一个过滤事件。
如果想通过一个按钮来响应两个不同的事件结构,需要考虑使用通报事件,或者把两个按钮放在前面板的同一个地方,然后通过程序改变它们的可见性。这样的话用户不会在同一个地方看到两个按钮,因此能够触发相对应的事件。
如果想在两个不同的结构中处理相同的过滤事件(“mouse down”), 妥协的方法是用一个事件结构来处理两个情况。一个简单的例子是把一个单一事件结构放在一个for循环中.然后把一个case结构放在事件结构内.根据循环的次数来决定执行哪一个case。因此一个事件结构能够处理这个事件并且结合事件改变操作。
楼主最近还看过