《LabVIEW工程之道》稀飯3-程序流程式控制制之順序與事件

來自專欄 LabVIEW工程實踐之路

說明:本部分來自於之前的《LabVIEW實踐之路》章節,當時用的8.2版LabVIEW,用於不太熟悉的兄弟們入門時的補充。由於同《LabVIEW工程之道》思路上區別不小,所以以附加文檔(稀飯)的形式給出,喫大餐式也可以來點稀飯~~

說明+:網頁排版有問題,見諒!

2.2 順序結構

顧名思義,順序結構就是強製程序運行時的前後順序。有時候我們想將幾個程序段按順序執行,而程序本身並沒有連線能夠保證這種順序(還記得前面說的嗎?LabVIEW的數據流向是順著連線從左往右的),那麼你可以使用順序結構。當然,如果連線能保證的,就不要像圖2.9的採集程序一樣畫蛇添足了,因為不使用順序結構的結果是一模一樣的,如圖2.10所示。

圖2.9 帶有順序結構的採集程序

圖2.10 不含順序結構的採集程序

從上面的圖中我們認識了順序結構的樣子之一,順序結構還有層疊式的,主要是避免前後多個順序段串起來太長,顯示不方便。圖2.11所示為順序結構的兩種形式。

圖2.11 平鋪式和層疊式順序結構

順序結構初始只有一個框,想要添加很簡單,直接在框上點右鍵添加就可以了。

下面我們來完成一個順序結構的程序:獲得一段程序運行耗費的時間。這兒將用到獲取當前時間的函數---獲取日期/時間(秒),在框圖的「定時」選板裏。程序前面板和框圖如圖2.12所示。

圖2.12 獲取程序運行時間

上面的框圖很簡單,就是在程序運行前獲取一下當前時間,在程序結束後再獲取當前時間,兩者之差就是程序運行時間。順序結構在這兒起了重要的作用。當然,運行一下程序你會發現每次得出的結果有點不同,想一想為什麼?

如果不加順序結構上面程序會得到什麼結果呢?這個問題我問得太簡單了~

圖 2.13 刪除順序結構後的結果

2.3 事件結構

事件結構的學習是挺激動人心的。不是說別的東東不重要,而是因為事件結構是實現眾多UI事件響應或其他內部事件響應的結構類型。也許你學過VC的事件機制,確實很好很強大,但學習者不能太傻太天真,VC的事件機制學習曲線有點陡(嘿嘿,不如說MFC太陡,陡陡陡…)。不過LabVIEW中的事件機制沒那麼難辦,尤其是UI事件。

閑話少說,先瞻仰事件結構的尊榮,如圖2.14所示。事件結構也是由邊框圍成的封閉結構,結構內部就是響應特定事件所要執行的程序,結構上方是所要響應事件的名稱,即事件分支(圖2.14顯示的是響應「超時」事件)。注意,以下幾句話比較重要,我們一句句解釋一下:

圖2.14 事件結構

1、 一個事件結構可以有多個事件分支,即可以層疊多個框(可以右鍵添加刪除)。不好意思,這一句是廢話~

2、 同一個事件結構裏,不能出現兩個事件分支都對同一個事件進行響應(注意,是「同一個事件結構裏」,不同事件結構就沒人管了)。簡單說,在一個單位只能「一個蘿蔔一個坑」,但不限制你去別的單位兼職。

3、 同一個事件分支可以同時對多個事件進行響應,也就是說可以「殊途同歸」。

還有還有,不過先不往下列了,實踐之路就得先實踐。我們來完成第一個事件結構的例子,是UI事件:判斷滑鼠是否在前面板內部,先上代碼如圖2.15。

圖2.15 事件結構判別滑鼠是是否進入前面板

好的,我們來解釋一下。程序中的事件結構共有3個事件分支:超時、滑鼠進入窗格和滑鼠離開窗格。超時是應用程序事件,另外兩個則是窗格事件。超時事件左上角連著時間(50毫秒),也就是說當50ms時間沒有發生本事件結構中其他任何事件分支時,程序將進入下一個循環,那麼很容易想到,如果我們不給超時事件賦值(或賦值為-1),那麼程序會一直等待有事件分支發生。以下通過添加「滑鼠進入窗格」事件說明事件結構的編輯方法。

右鍵點擊事件結構上方的分支列表,選擇「添加事件分支」後就進入了「編輯事件」對話框,如圖2.16所示。下方「事件源」中選擇你的事件的來源,是來自應用程序(如超時事件)、窗格(如本例中的滑鼠進入)以及某控制項(如按鈕、文本框、列表框等等等等)。下方右側可以選擇特定的事件。那麼上部的「事件說明符」列表有什麼用嗎?看到 + 和 × 

沒有?你可以在當前處理分支裡面通過 + 添加多個事件!當然也可以想刪誰就刪誰~別急,下一個例子就會讓大家體驗一下。

在添加了「窗格」的「滑鼠進入」事件後,點擊確認完成本次添加,這時框圖程序的事件結構中就多了該事件分支。

為了響應滑鼠進入窗格的事件,我們在前面板放置一個字元串顯示控制項 圖2.16 編輯事件對話框

並賦值為「滑鼠進入」,那麼就能保證當滑鼠進入前面板窗格時就會顯示「滑鼠進入」字元。

按照同樣的方法添加「窗格」的「滑鼠離開」事件。這時問題來了,我們還想用剛才創建的前面板字元串顯示控制項來提示「滑鼠離開」,怎麼辦?沒法把線連過去啊?那麼我們就來使用一種不採用連線的數據流動或共享方法,在這兒可以用局部變數或屬性節點(這種方法之後會詳細說)等。我們看一下如圖2.17如何創建控制項的局部變數,很簡單,右鍵!

創建

完成後,根據需要設置其是讀取或寫入,我們的例子當然是寫入,完成狀態字元串的更新。

以上的例子很簡單,事件結構的每一個事件分支均響應一個事件,並且這些事件都是預定義的系統或UI事件。是不是覺得不夠過癮?畢竟有些事件,特別是非UI事件,是必須由用戶自己定義的,這種情況怎麼辦呢?

很簡單,看圖2.17中的事例---當模擬數據大於0.97時顯示該數值並點亮紅燈半秒鐘(當然,該例中實際上我們可以不用事件結構就能實現該功能,但許多情況下事件結構是不錯的選擇)。

圖2.17 註冊用戶事件

首先告訴大家,註冊用戶事件的子VI在函數選板>>對話框與用戶界面>>事件選板下,如右圖所示。對於用戶自己定義的事件,可以用這些VI來實現,其流程是這樣的:首先需要「創建用戶事件」,這時需要連接你在事件中所要傳輸數據的類型給此VI,並且要給其一個唯一的標籤,就像圖2.17中的

然後註冊該事件,因為註冊事件後纔有了事件句柄(嘿嘿,從VC裡面借用該詞,不一定準確)可以給處理程序使用

;接下來在事件發生的框圖內使用「創建用戶事件」並將值付給該VI;最後需要在事件結構中處理該事件,創建分支的步驟同前一個例子一樣,不過注意的是,事件結構默認樣式下邊框上沒有連接動態事件接線端的位置,那怎麼辦?答對了!點擊右鍵選中就可以了。

各位小朋友一定注意到了,上面例子用到了不少局部變數,對於結束程序的布爾按鈕用到了兩個,而對於報警燈也用到了兩個,這是不需要連線的共享方法(不過我更喜歡用屬性節點,嘿嘿,後面會有例子)。我們拿停止按鈕來解釋一下這種用法。

注意,本例中有兩個while循環,我們準備用一個按鈕來停止。前面已經知道了,由於LabVIEW連線的數據流本質,導致了沒有退出循環前,數據流連線無法直接送出去,因此就用按鈕的局部變數來實現。這兒必須注意按鈕等布爾控制項對點擊事件的響應方式有多種(右鍵能查看、修改),後面我們會細說。要保證點擊按鈕後,兩個循環都能退出,我們必須做到按鈕為「真」的狀態保持到兩個循環都退出以後,當然推出以後按鈕要置回「假」。上例中是我比較喜歡使用的方法,實質上也是利用了數據流連線連到外面的順序框上保證了兩個循環都能退出。

好了,這個例子不多說了,努努力,你肯定能夠實現。如果一步步將所有的流程都列出來,那就不是學習,而是純粹的模仿和重複,加油吧!

事件部分再給一個例子吧,就是通過一個事件分支判斷到底是滑鼠那個鍵被按下或釋放,程序如圖2.18所示。

圖2.19 一個事件分支響應多個事件

上例用一個事件分支響應了兩個事件:滑鼠按下和滑鼠釋放,事件添加方式前面說過了,不會忘了?這個例子比較簡單,因為兩個事件(滑鼠按下、滑鼠釋放)是同一類型的,所以處理起來很簡單。

好的,我們對於事件結構的學習暫時到這兒,其實在這一部分還看到了多循環並行的使用以及局部變數的妙用。後面還有機會使用事件結構完成非常實用的程序,主要是響應各種按鈕事件、菜單事件以及各種自定義事件。當然,飯要一口口的喫,諸如21天精通某編程語言的聖經屬於大仙們的讀物,作為人類我們可以省省啦。

推薦閱讀:

相關文章