LabVIEW界面程序最常用的结构就是循环事件结构。用事件结构截获用户在界面上对控件的操作,然后做出相应处理。
在文本语言中,常用的事件处理方法与LabVIEW是不同的。文本语言常常使用回调函数来处理界面事件。比如:某个按钮按下时,需要做一个fft运算。那么就写一段函数来完成这个fft运算,再把这个函数与按钮按下事件关联起来。开发语言通常已经做好了对事件的监控,一旦发现按钮按下事件产生了,就去调用与它关联的fft运算函数。这个有开发者编写,被系统调用的函数就叫做回调函数。
LabVIEW也可以采用与文本语言相类似的方法来处理事件:不是在事件结构内处理,而是在程序开始时,就为某事件注册一个回调VI。在回调VI内编写相应代码,一旦事件发生,这段代码就会被执行。
与事件结构相比,回调VI编写起来稍微麻烦一点;但它的好处是,它和主VI是平行运行的。如果事件处理过程比较耗时,把它放在事件结构中会阻塞整个程序,使得程序界面暂时失去响应;而把它放在回调VI中,则不会影响程序其它部分的运行。
比如下面这个例子。程序界面上有两个仪表盘:左面那个始终在运转,每10秒钟旋转一圈;右边那个,由按钮控制,按下按钮才旋转一圈。若把旋转右表这个工作放到事件结构的按钮按下处理分支中去做,它势必会打断左表的旋转,因此,考虑把它放到回调VI中去做。
程序的代码也比较简单。先看代码的右半部份:这是一个典型的循环事件结构,用来控制左表的旋转。但是注意,右表的控制并不是在这个结构中实现的。
再看程序左半部分:它为按钮“右表旋转一圈”的值改变事件注册了一个回调VI。
注册回调VI用的是节点“Register Event Callback”,它在函数选板“Connectivity –> ActiveX”上。这个节点主要是为了给ActiveX、.NET控件的事件注册回调VI。事件结构无法截获ActiveX、.NET控件的事件,因此只能通过回调VI的方式来处理这些控件的事件。但是这个节点也可以用于给LabVIEW自带的控件注册回调VI。
注册回调VI节点,有三个输入参数从上至下分别是:事件的发出者、回调VI、用户自定义数据。
在我们这个例子中,需要截获的是按钮“右表旋转一圈”的值改变事件,因此需要把“右表旋转一圈”控件的引用作为第一个参数传递给注册回调VI节点。指定好事件的发出者,接下来需要选择事件的类型,鼠标点击注册回调VI节点的第一个参数的接线方块,发现“右表旋转一圈”按钮的所有事件都已经列在这里了,选择“值改变”事件。
第三个参数是用户自定义数据,可以是任意类型的数据,在回调VI中需要用到的数据都可以通过它来传递。因为我打算在回调VI中对控件“右表”做修改,因此,在这里把“右表”的引用作为数据传递给回调VI。
第二个参数是回调VI的引用,如果已经写好了回调VI,把引用传进去就行了。我还没有编写回调VI,因此可以在参数的接线端上点击鼠标右键,选择“Create Callback VI”创建一个空白的回调VI。
回调VI中写一小段代码,让右表旋转一圈,整个程序就完成了。这时,左右表可以各自运行,互不影响。
文章评论(0条评论)
登录后参与讨论