跳到主要内容

后台任务

· 阅读需 7 分钟

https://labview.qizhen.xyz/zheng-wen-mu-lu/vi\_server/vi\_server\_for\_subvi#hou-tai-ren-wu

有一些任务在运行的时候,并不需要与用户交互。它们通常在不打扰用户其它工作的时候默默的执行。这样的任务叫后台任务。与之对比,前台任务就是用户看得见的。 比如,一个文本编辑软件,帮助用户上编辑文字的任务都是前台执行的。如果这个软件做得好,最好还有自动保存文件的功能,这样在系统突然崩溃之后,不至于所有用户做的改动都白费。自动保存这个功能一般都被作为后台任务,他在执行时,不打扰用户其它工作。 后台任务的应用还有很多。在 LabVIEW 中实现后台任务的方法,就是使用 VI Scripting 技术,动态把负责后台的任务在新的线程里启动起来。下面以一个比较常用的功能来说明后台任务是如何实现的。

大型 LabVIEW 程序启动的时候可能会比较慢,这是因为程序在它所有的子VI都被装入内存之后才能执行。把大量子VI装入内存可能要花费几秒钟的时间,如果这段时间,什么都不显示给用户,用户可能会以为是程序出错或者死机了,从而做出一些错误的操作。好的做法是,在启动程序的时候立刻显示给用户一个提示界面,告诉用户程序正在装载,已经装载的进度。同时把所有的子VI装入内存,然后再启动程序的主界面。 在程序显示启动画面这个阶段,当子VI全部装入内存后,启动画面仍然显示在前台,而程序会再启动一个后台任务,把主程序运行起来。之后,启动画面程序把自己关闭,而主程序界面也从后台跳到前台来了。 启动画面的程序代码如下图所示:

    它由5个部分组成: 第1部分负责把主程序的子VI都装入内存(用 Open VI Reference 函数打开这些子 VI 就可以把它们装入内存)。这部分与后台任务无关,不细说了。 第2部分 Open VI Reference 函数打开主程序的主VI,它的输入是主VI的地址。后续使用到的针对这个 VI 的 Scripting 函数,都依赖于在此打开的 VI 的引用。 第3部分设置主VI的 Front Panel:Open 属性。这个属性值为真的时候,主程序的界面被显示出来。在我们这个程序中,主程序最终是要跳到前台来与用户交互的,所以需要显示他的界面。有些后台任务,比如自动保存任务,没有交互界面,就不需要设置此属性。 第4部分调用主VI的 Run VI 方法。调用这个方法之后,主程序开始运行。目前主程序还是作为后台任务在运行。这里需要注意的是 Run VI 方法的两个参数: Wait Until Done 参数如果设为真,启动画面程序运行到这里就会暂停下来,一直等到后台任务结束,才继续执行后面的代码。但是,作为启动画面程序,我们显然不希望出现这种情况。我们需要让前台任务和后台任务同时执行,所以这个参数在本程序中被设为“假”。后台程序在另一个线程中被执行,它的结束与否不影响当前程序的执行,我们的启动画面程序会立即去执行下一条语句。 用 Open VI Reference 函数打开的引用必须被关掉,否则,VI被装入内存,却从来不被卸除出内存,就会引起内存泄漏。Auto Dispose Ref 参数用于决定由谁来关闭动态运行起来的VI的引用,是前台任务,还是后台任务自己。真对于我们的例子,后台任务是主程序,我们希望用户关闭它的同时,把它从内存中卸除。所以实例中这个参数的值是“假”,后台程序结束时自动释放引用。对于那些没有界面的后台任务,它们的启动、停止都需要由前台程序来控制。这是这个参数就需要被设为“真”。前台程序还需要这个引用来停止后台任务、卸除后台任务的VI。 第5部分是对启动画面VI自身进行操作的。程序运行到这里,主程序已经运行起来,而启动画面程序的使命也已完成,应当让位给主程序了。启动画面程序在此调用 Front Panel:Close 把自己关闭。

《我和 LabVIEW》目录