【LabVIEW】执行系统(多线程)

一、什么是执行系统
早期 LabVIEW 的 VI 都是单线程运行的,LabVIEW 5.0 后才引入了多线程运行。

其实,对于并排摆放的LabVIEW 函数模块而言,即使LabVIEW 不为它们分配不同的线程,通常也是“并行执行”的。LabVIEW 会把它们拆成片断,轮流执行。

这有一点像是 LabVIEW 为自己设计了一套多线程调度系统,在系统的单个线程内并行执行多个任务。

LabVIEW中这样一套把VI代码调度、运行起来的机制叫做执行系统

LabVIEW2010共设有7个执行系统,分别是:

1、用户界面

程序中所有与界面相关的代码都是放在用户界面执行系统下执行的。

就算你为一个 VI 设置了其他的执行系统,这个 VI 的前面板被打开后,他上面的数据更新的操作也会被放在用户界面执行系统下运行。

还有一些工作,比如利用 Open VI Reference 节点动态的把一个 VI 加载到内存的工作,也是在用户界面执行系统下运行的。

因为 LabVIEW 是自动多线程的,如果一些模块不能保证多线程安全,就需要把他们设定为在用户界面线程运行。这样就等于强制他们在同一个线程下执行,以保证安全。

2、标准

是最常用的配置方式.

3、仪器I/O

一般用于发送命令到外部仪器,或从仪器中读取数据。这是程序中较为重要的操作,需要及时运行。所以仪器I/O执行系统中的线程的优先级比其他执行系统中的线程要高一些。

4、数据采集

一般用于快速数据采集。数据采集执行系统中的线程的数据堆栈区比较大。

5、其它1

6、其它2

如果你一定要让某些 VI 运行在独立的线程内,则可以使用其他1、其他2这两个选项。

7、与调用方相同

表示这个 VI 沿用调用它的上层 VI 设置的执行系统。如果顶层 VI 也选择“与调用方相同”,那么就等于它选择了标准执行系统。

一个应用程序中使用到的众多子VI可以是分别放在不同的执行系统里运行的。用户在VI属性面板上选择 Execution页面,可以在这个页面指定或更改某个 VI 的首选执行系统。

具体操作是:
》文件》VI属性》执行》设置首选执行系统

通常所创建的VI其默认执行系统是:与调用方相同。
绝大多数情况下,用户使用界面执行系统、标准执行系统就已经足够了。



二、执行系统与线程的关系

LabVIEW 在支持多线程以后,不同的执行系统中的代码肯定是运行在不同线程下的。

用户界面执行系统只有一个线程,并且是这个程序的主线程。

这一点与其他执行系统都不一样,其他的执行系统都可以开辟多个线程来执行代码。

用户除了可以设置 VI 的执行系统,还可以设置它的优先级。

优先级分 5 个档次(暂先不考虑 subroutine)。

在 LabVIEW 7.0 之前, LabVIEW 在默认情况下为同一个执行系统下每个档次的优先级开启一条独立的线程;

而在LabVIEW 7.0 之后,LabVIEW 在默认会默认的为每个执行系统下每个档次的优先级开启 4 条线程。

在用C语言编写多线程程序时,你还要注意不能开辟太多的线程,因为线程开辟、销毁、切换等也是有消耗的。线程太多可能效率反而更差。

但是使用 LabVIEW 就方便多了。在使用默认设置的情况下,LabVIEW最多为你的程序开辟 5 条线程

一条用户界面线程,四条标准执行系统标准优先级下的线程。五条线程不会引起明显的效率损失。

三、使用多线程要注意的

1. 一般情况下,编写程序时应当遵循这样的原则:
可以同时运行的模块就并排摆放,千万不要用连线,顺序框等方式强制它们依次执行。在并行执行时, LabVIEW 会自动地把它们安排在在不同线程下同时运行,以提高程序的执行速度,节省程序的运行时间。

2. 假如有一个或某几个线程占用了100%的CPU,此时系统对其他线程就会反应迟钝。
例如,程序的执行线程占用了100% 的 CPU,那么用户对界面的操作就会迟迟得不到响应,甚至于用户会误认为程序死锁了。所以在程序中要尽量避免出现 100% 占用 CPU 的情况。
此类问题最简单的解决方法就是在循环内加一个延时。如果在每个循环内加上100毫秒的延时,CPU占用率就会接近为 0。

3、对于总运行时间较短的循环(假如CPU 占用总时间不足100毫秒)就没有必要再加延时了。

4、对于那些确实非常耗费CPU资源的运算(如需要100%地占用CPU几秒钟甚至更长的时间),最好也在循环内插入少量延时,从而让CPU至少空出10%的时间给其它线程或进程。你的程序会因此而多运行10%的时间。

但是由于CPU可以及时处理其他线程的需求,比如界面操作等,其他后台程序也不会被打断,用户反而会感觉到程序似乎运行得更加流畅。反之,假如你的程序太霸道了,CPU长期被某些运算所霸占,而别的什么都不能做,这样的程序,用户是不可能满意的。

5、某些运算可能需要程序循环1,000,000次,每执行一次仅需要0.1毫秒。此时如果在每次循环里都插入延时,即使是1毫秒的延时,也会令程序速度减慢10倍。这当然是不能容忍的。这种情况下,就不能在每次循环都加延时了,但可以采用每一千次循环后加上10毫秒延时的策略。此时,程序仅减慢10%左右,而CPU也有处理其他工作的时间了。
 
6、在处理界面操作的VI中,常常会使用到 While 循环内套一个 Event Structure 这种结构形式。在这种情况下,就没有必要再在循环内添加延时了。因为程序在执行到 Event Structure 时,如果没有事件产生,程序不再继续执行下去,而是等待某一事件的发生。这是,运行这段代码的线程会暂时休眠,不占用任何 CPU 资源,一直等到有事件发生,这个线程才会重新被唤醒,继续工作。


来源:

http://blog.sina.com.cn/s/articlelist_1289595790_0_1.html
https://blog.csdn.net/hhko12322/article/details/8650217/

使用执行系统和优先级的建议(官网):
https://zone.ni.com/reference/zhs-XX/help/371361R-0118/lvconcepts/suggestions_for_exec/

/*******相与枕藉乎舟中,不知东方之既白*******/
原文地址:https://www.cnblogs.com/Mars-0603/p/15049991.html