1 事件結(jié)構(gòu)及它的圖形化表示法
事件被用來(lái)通知用戶(hù)有異步活動(dòng)發(fā)生。圖形化語(yǔ)言的事件響應(yīng)包括:用戶(hù)界面事件、外部I/O事件和程序其它部分的事件。
對(duì)事件的處理程序也被稱(chēng)為:事件驅(qū)動(dòng)程序。事件驅(qū)動(dòng)程序可以分為若干個(gè)分支,每個(gè)分支處理不同的事件響應(yīng)。所以對(duì)事件的響應(yīng)結(jié)果也可以控制程序的流程。
事件驅(qū)動(dòng)機(jī)制來(lái)自于可視化的操系統(tǒng),可視化操作系統(tǒng)對(duì)用戶(hù)事件提供了簡(jiǎn)潔、有效的響應(yīng)方式,最常見(jiàn)的事件來(lái)自于鼠標(biāo)和鍵盤(pán)。
虛擬儀器借助于操作系統(tǒng)的事件處理機(jī)制實(shí)現(xiàn)了圖形化語(yǔ)言的事件響應(yīng)能力。在沒(méi)有引入事件結(jié)構(gòu)之前,LabVIEW是借助于輪詢(xún)的方式來(lái)查詢(xún)用戶(hù)操作,由于輪詢(xún)的方式會(huì)占用一定的CPU資源,甚至可能遺漏事件,所以這種處理方式并非理想。事件結(jié)構(gòu)的出現(xiàn)避免了對(duì)CPU資源的占用,同時(shí)也避免了事件的遺漏。
事件結(jié)構(gòu)在函數(shù)選板》編程》結(jié)構(gòu)子選板中可以找到,并可以將其直接拖拽到程序框圖中,圖形化表示的事件結(jié)構(gòu),參見(jiàn)下圖。
圖 1 圖形化的事件結(jié)構(gòu)
與Case結(jié)構(gòu)和循環(huán)結(jié)構(gòu)類(lèi)似,事件結(jié)構(gòu)也包含了一個(gè)主框架,這個(gè)框架內(nèi)將用來(lái)放置事件處理的事件驅(qū)動(dòng)程序代碼。如果事件處理任務(wù)眾多,會(huì)有眾多事件分支存在,在結(jié)構(gòu)上類(lèi)似Case的多幀結(jié)構(gòu)(選擇器標(biāo)簽)。
當(dāng)在程序框圖上拖放一個(gè)事件結(jié)構(gòu)時(shí),我們只能看到上圖所示的一幀已經(jīng)預(yù)先注冊(cè)的超時(shí)事件(Timeout),超時(shí)事件分支。它具有定時(shí)延遲的基本功能(不包括While循環(huán)),參見(jiàn)下圖。
圖 2具有定時(shí)延遲的基本功能
當(dāng)然也可以采用另一種表示方法,參見(jiàn)下圖。
圖 3利用事件結(jié)構(gòu)內(nèi)部節(jié)點(diǎn)獲得中止時(shí)間
通過(guò)這個(gè)例子也好理解內(nèi)部節(jié)點(diǎn)中“時(shí)間”的含義(是事件響應(yīng)的停止時(shí)間)。
超時(shí)事件
超時(shí)事件是一種特殊的事件,當(dāng)然也可以看成是默認(rèn)的事件分支。如果存在其它事件源時(shí),超時(shí)事件完全可以被忽略或取消。看下面一個(gè)例子。
圖 4僅有的兩個(gè)事件之一——超時(shí)事件
圖 5僅有的兩個(gè)事件之一——“停止”鼠標(biāo)按下
這個(gè)例子運(yùn)行狀況是這樣的:程序運(yùn)行后進(jìn)入超時(shí)事件,等待5秒鐘后,在字符串顯示器中顯示:“嗨。。。5秒鐘內(nèi),用戶(hù)沒(méi)有操作!”(標(biāo)志超時(shí)事件已經(jīng)結(jié)束)。然后一直等待用戶(hù)操作,當(dāng)用戶(hù)點(diǎn)擊停止按鍵后,程序停下來(lái),同時(shí)顯示:“哈哈,終于響應(yīng)了。”
為了響應(yīng)多個(gè)事件的請(qǐng)求,所以要求在事件結(jié)構(gòu)外面套加一個(gè)While循環(huán)。以便能夠及時(shí)準(zhǔn)確的響應(yīng)每個(gè)事件。
5.6.2 事件結(jié)構(gòu)的數(shù)據(jù)流運(yùn)行機(jī)制
從數(shù)據(jù)流的運(yùn)行機(jī)制來(lái)看,事件可以理解為多個(gè)無(wú)定序的數(shù)據(jù)源。事件的響應(yīng)處理過(guò)程是根據(jù)事件發(fā)生的先后順序,依次進(jìn)行處理。而事件的處理過(guò)程仍然是依據(jù)數(shù)據(jù)流運(yùn)行機(jī)制的。
所謂多個(gè)無(wú)定序的數(shù)據(jù)源是指:事件發(fā)生是隨機(jī)的,它們之間沒(méi)有固定的時(shí)間或先后順序關(guān)系。
事件結(jié)構(gòu)的運(yùn)行機(jī)制是一個(gè)一個(gè)的處理事件,這樣就要求在事件處理程序上要求:簡(jiǎn)單快速執(zhí)行,避免事件處理過(guò)程中產(chǎn)生不必要的堆積。
下面通過(guò)一個(gè)例子來(lái)進(jìn)一步理解事件結(jié)構(gòu)中需要注意的一些問(wèn)題。
例 5-14 事件處理的演示
在例子程序的前面版中,我們放置了四個(gè)控件。門(mén)——布爾控件表示一個(gè)門(mén)(鼠標(biāo)點(diǎn)擊相當(dāng)于敲門(mén));敲門(mén)次數(shù)——控件用來(lái)紀(jì)錄事件的次數(shù);停止——布爾控件用來(lái)停止演示程序的運(yùn)行;其中還有一個(gè)門(mén)把手裝飾用控件。
下面我們?cè)诰唧w看看它的程序框圖。
圖 6 例5-14的程序框圖(僅包含兩個(gè)事件源)
評(píng)論