一、什么是執行系統
早期 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/
