眾所周知:LabVIEW中的事件結(jié)構(gòu)可以響應(yīng)用戶操作,并且它會(huì)根據(jù)發(fā)生的事件來決定執(zhí)行不同事件分支。當(dāng)發(fā)生某個(gè)事件時(shí),事件結(jié)構(gòu)會(huì)自動(dòng)捕獲,并自動(dòng)執(zhí)行對(duì)應(yīng)代碼。
使用事件結(jié)構(gòu)克服了以前輪詢方式結(jié)構(gòu)的缺點(diǎn),可以讓我們的代碼更加高效,極大提升了界面處理的運(yùn)行效率,同時(shí)也降低了CPU占用,提高了用戶使用體驗(yàn)。但有時(shí)候事件結(jié)構(gòu)中已有的事件種類并不能完全滿足我們的需求,這時(shí)候應(yīng)該怎么辦呢?其實(shí)動(dòng)態(tài)事件就是為此而生,開發(fā)人員可以通過自定義注冊(cè)和使用動(dòng)態(tài)事件,滿足各種特殊情況下的事件響應(yīng)需求。
接下來請(qǐng)大家跟隨小編一起學(xué)習(xí)LabVIEW事件結(jié)構(gòu)以及動(dòng)態(tài)事件的使用!
本文分享:
LabVIEW動(dòng)態(tài)事件
一、 事件結(jié)構(gòu)介紹
事件結(jié)構(gòu)和條件結(jié)構(gòu)比較類似,它們都是通過滿足某個(gè)條件來選擇執(zhí)行其對(duì)應(yīng)分支代碼的一種結(jié)構(gòu);區(qū)別在于條件結(jié)構(gòu)是根據(jù)條件接線端的選擇來決定執(zhí)行對(duì)應(yīng)的分支,而事件結(jié)構(gòu)則是根據(jù)發(fā)生的事件來決定執(zhí)行對(duì)應(yīng)的分支。
事件結(jié)構(gòu)可以自動(dòng)捕獲所發(fā)生的事件,并根據(jù)事件選擇執(zhí)行不同的事件分支。事件結(jié)構(gòu)正上方內(nèi)側(cè)的事件標(biāo)簽可以顯示當(dāng)前分支所對(duì)應(yīng)的事件,除此之外,事件結(jié)構(gòu)還可以捕獲有關(guān)該事件的一些相關(guān)數(shù)據(jù),比如事件發(fā)生的時(shí)間、事件源、類型等。
二、 事件分類
事件可以根據(jù)事件產(chǎn)生的源來區(qū)分,LabVIEW中的事件可以分為六大類,它們分別是:<應(yīng)用程序>、<本VI>、<窗格>、<分隔欄>、<控件>以及<動(dòng)態(tài)>。這六類事件可以在“編輯事件”對(duì)話框的“事件源”這一欄中看到,而每一個(gè)事件源中對(duì)應(yīng)的具體事件可以在“事件”欄中看到,如下圖所示:
<應(yīng)用程序>
這類事件主要反映整個(gè)應(yīng)用程序狀態(tài)的變化,例如程序是否關(guān)閉,書簽信息是否有改動(dòng),是否超時(shí)等。事件結(jié)構(gòu)中默認(rèn)的超時(shí)分支就是該類事件。
<本VI>
這類事件主要反映當(dāng)前VI狀態(tài)的改變,例如前面板大小以及狀態(tài)、鼠標(biāo)、鍵盤對(duì)本VI的操作狀態(tài)、是否選擇了本VI菜單項(xiàng)中的某一個(gè)等。
<窗格>
這類事件包括與前面板中某一窗格有關(guān)的事件,比如鼠標(biāo)進(jìn)入/離開某一個(gè)窗格。一般情況下一個(gè)VI的前面板都是默認(rèn)只有一個(gè)窗格,但是如果前面板上使用了“分隔欄”那就可以將一個(gè)VI的前面板分隔為多個(gè)窗格。每個(gè)窗格都可以理解為新的且互相獨(dú)立的前面板,可以用來放置不同類型的控件。
<分隔欄>
這類事件主要包括與分隔欄有關(guān)的事件,比如鼠標(biāo)在分隔欄上點(diǎn)擊/釋放等。分隔欄可以用來劃分VI前面板的不同功能區(qū)域,讓我們的界面設(shè)計(jì)和布局更加美觀且條理分明。
<動(dòng)態(tài)>
這類事件用于處理在程序中臨時(shí)注冊(cè)的事件或者用戶自定義的事件,在未注冊(cè)動(dòng)態(tài)事件之前,該事件源為灰色不可選狀態(tài),下面本文將詳細(xì)介紹動(dòng)態(tài)事件。
二、 動(dòng)態(tài)事件
概述:
動(dòng)態(tài)事件可以分為兩種,一種是由LabVIEW本身可以產(chǎn)生的動(dòng)態(tài)事件,比如前面介紹的除了動(dòng)態(tài)事件以外的其他五種分類的事件(也就是說這五種事件可以被注冊(cè)成為動(dòng)態(tài)事件),還有一種是由用戶自己定義的動(dòng)態(tài)事件。
動(dòng)態(tài)事件相關(guān)的函數(shù)在程序框圖面板>>編程>>對(duì)話框與用戶界面>>事件中。接下來我們先了解一下事件子程序框圖中的這些節(jié)點(diǎn)。
所有動(dòng)態(tài)事件在使用之前都需要先注冊(cè)事件,它的含義其實(shí)是將動(dòng)態(tài)事件注冊(cè)到事件結(jié)構(gòu)中,即聲明該動(dòng)態(tài)事件將在這個(gè)事件結(jié)構(gòu)中響應(yīng)。兩種動(dòng)態(tài)事件都可以使用“注冊(cè)事件”節(jié)點(diǎn)來注冊(cè),注意在程序結(jié)束后需要使用“取消注冊(cè)事件”來關(guān)閉注冊(cè)事件引用句柄。
在使用用戶自定義的動(dòng)態(tài)事件時(shí)需要先使用“創(chuàng)建用戶事件”創(chuàng)建該動(dòng)態(tài)事件,然后再使用“注冊(cè)事件”將該動(dòng)態(tài)事件注冊(cè)到一個(gè)事件結(jié)構(gòu)中,在需要觸發(fā)事件的地方使用“產(chǎn)生用戶事件”來讓事件結(jié)構(gòu)響應(yīng)該事件,在程序不需要再次響應(yīng)用戶事件時(shí)使用“銷毀用戶事件”來銷毀用戶事件引用句柄,釋放用戶事件引用。所有注冊(cè)為該用戶事件的事件結(jié)構(gòu)不再接收該事件。
LabVIEW自產(chǎn)生動(dòng)態(tài)事件:
事件分類中提到的除了“動(dòng)態(tài)”事件之外的那五類靜態(tài)事件都可以被注冊(cè)為L(zhǎng)abVIEW自產(chǎn)生的動(dòng)態(tài)事件,區(qū)別就是靜態(tài)事件只能是本VI中對(duì)象產(chǎn)生的,而動(dòng)態(tài)事件卻可以在一個(gè)VI中使用其他VI中的對(duì)象產(chǎn)生的事件。
設(shè)想一個(gè)場(chǎng)景:在一個(gè)大型項(xiàng)目中,往往會(huì)使用大量的子VI,一般情況下我們會(huì)有一個(gè)VI專門用來響應(yīng)事件操作,而這個(gè)VI經(jīng)常必須要處理其他VI的控件產(chǎn)生的事件,但是這個(gè)控件很明顯并不在這個(gè)VI中,所以在這個(gè)VI的事件結(jié)構(gòu)編輯事件的對(duì)話框中是沒辦法找到這個(gè)控件的,LabVIEW中為了應(yīng)對(duì)這種狀況專門設(shè)計(jì)了動(dòng)態(tài)事件。
在注冊(cè)動(dòng)態(tài)事件時(shí),需要先為產(chǎn)生這個(gè)事件的對(duì)象(控件、窗格、分隔欄等)創(chuàng)建一個(gè)引用,然后將該引用連線至“注冊(cè)事件”的事件源輸入接線端,隨后將“注冊(cè)事件”生成的“注冊(cè)事件引用句柄”連線至事件結(jié)構(gòu)的“動(dòng)態(tài)事件接線端”完成事件的注冊(cè),如下圖所示:
上圖中的程序框圖是子VI的程序框圖,一共注冊(cè)了兩個(gè)動(dòng)態(tài)事件,一個(gè)是主VI窗格的鼠標(biāo)移動(dòng)事件,另一個(gè)是主VI中“停止”按鈕的值改變事件。 這兩個(gè)事件注冊(cè)完成后可以在這個(gè)事件結(jié)構(gòu)的編輯事件對(duì)話框<動(dòng)態(tài)>一欄找到并編輯使用。 上圖中前面板為主VI的前面板,功能是在“鼠標(biāo)坐標(biāo)”中實(shí)時(shí)跟隨并刷新鼠標(biāo)在前面板中的位置坐標(biāo),按下停止按鈕后響應(yīng)并停止程序運(yùn)行(示例代碼會(huì)在后面給出)。
用戶事件:
假設(shè)需要在程序中,在滿足其它某種條件時(shí)也產(chǎn)生一個(gè)事件,而這個(gè)條件不是LabVIEW自產(chǎn)生的(如用戶按了某個(gè)按鈕、改變某個(gè)控件值等),這時(shí)就可以考慮用戶自定義事件了。
用戶自定義事件靈活性較高,可以讓用戶自己設(shè)計(jì)什么時(shí)候發(fā)生并執(zhí)行什么事件代碼,使用用戶事件時(shí)需要先定義一個(gè)用戶事件數(shù)據(jù)類型,就像建立消息隊(duì)列時(shí)需要定義隊(duì)列元素的數(shù)據(jù)類型一樣,用戶事件數(shù)據(jù)類型可以是LabVIEW支持的任意數(shù)據(jù)類型。
和LabVIEW自產(chǎn)生動(dòng)態(tài)事件相同的是創(chuàng)建用戶事件之后同樣需要在一個(gè)事件結(jié)構(gòu)中注冊(cè)該事件,不同的是事件什么時(shí)候發(fā)生、在哪個(gè)VI中發(fā)生我們都是可以自定義的,只需要拿到創(chuàng)建用戶事件后的輸出句柄使用“產(chǎn)生用戶事件”產(chǎn)生一次該事件。
下面這個(gè)示例是模擬一個(gè)溫度采集VI和顯示界面VI之間的交互,溫度采集VI采集到溫度信息后使用用戶事件的方式傳遞給顯示界面VI去做對(duì)應(yīng)的處理,顯示當(dāng)前報(bào)警信息并且當(dāng)溫度太高時(shí)LED燈報(bào)警(示例代碼會(huì)在后面給出)。
示例中注冊(cè)了兩個(gè)用戶事件,一個(gè)是“溫度報(bào)警”事件,一個(gè)是“停止程序”事件。 注冊(cè)用戶事件時(shí)有個(gè)小技巧就是可以將你要注冊(cè)的所有用戶事件輸出句柄捆綁到一個(gè)簇中,然后使用“注冊(cè)事件”節(jié)點(diǎn)直接注冊(cè)這個(gè)簇,這樣可以方便同時(shí)注冊(cè)多個(gè)事件。
以上就是關(guān)于LabVIEW動(dòng)態(tài)事件的知識(shí)分享啦。 本文的演示代碼及安裝包已存入百度網(wǎng)盤,有需要的小伙伴可以自行取用,演示代碼請(qǐng)使用LabVIEW 2020及以后版本打開。
審核編輯:湯梓紅
-
cpu
+關(guān)注
關(guān)注
68文章
10772瀏覽量
210445 -
LabVIEW
+關(guān)注
關(guān)注
1958文章
3651瀏覽量
321446 -
面板
+關(guān)注
關(guān)注
13文章
1666瀏覽量
53724 -
代碼
+關(guān)注
關(guān)注
30文章
4697瀏覽量
68085 -
應(yīng)用程序
+關(guān)注
關(guān)注
37文章
3223瀏覽量
57504
原文標(biāo)題:知識(shí)分享 | LabVIEW中的動(dòng)態(tài)事件
文章出處:【微信號(hào):華穗科技,微信公眾號(hào):華穗科技】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論