程序結(jié)構(gòu)設(shè)計_第1頁
程序結(jié)構(gòu)設(shè)計_第2頁
程序結(jié)構(gòu)設(shè)計_第3頁
程序結(jié)構(gòu)設(shè)計_第4頁
程序結(jié)構(gòu)設(shè)計_第5頁
已閱讀5頁,還剩67頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

智能儀器技術(shù)應(yīng)用程序框架和設(shè)計模式什么是設(shè)計模式?一種LabVIEW程序模板與架構(gòu)

軟件實踐中通用的程序架構(gòu),其本質(zhì)是對很多十分類似的問題進行總結(jié)歸納的基礎(chǔ)上提煉出的一些具有代表性的軟件開發(fā)規(guī)范具有靈活的配置功能被廣泛使用使用設(shè)計模式的益處簡化整個開發(fā)過程更容易理解程序代碼代碼可重用可靠性被使用多年,被證明其“可用并可靠”大量技術(shù)資源與例程使用設(shè)計模式注意事項1、不是一成不變的定律,既要知道有哪些設(shè)計模式,還要知道每種模式解決實際應(yīng)用中的哪些問題,是如何解決的,效果如何?2、文本式編程語言中廣泛使用的設(shè)計模式在圖形化數(shù)據(jù)流編程中的應(yīng)用問題。注意!有些時候你沒有必要選用最復(fù)雜的設(shè)計模式不要忘記最常見的設(shè)計模式——數(shù)據(jù)流!通用型:狀態(tài)機模式、

消息隊列模式、

用戶界面事件模式專用型:主從線程模式、

生產(chǎn)/消費模式、

后臺服務(wù)模式、 應(yīng)用程序啟動模式、

代理模式LabVIEW設(shè)計模式

本講內(nèi)容應(yīng)用程序框架和設(shè)計模式1.2.3.4.基于循環(huán)和分支結(jié)構(gòu)的程序框架基于事件結(jié)構(gòu)的程序框架標準狀態(tài)機生產(chǎn)者/消費者設(shè)計模式本講內(nèi)容本講討論的問題如何建立一個具有一定規(guī)模的完整應(yīng)用程序?

應(yīng)用程序框架和設(shè)計模式應(yīng)用程序框架(ApplicationFramework)?

供軟件開發(fā)者使用的用以實現(xiàn)特定編程環(huán)境下應(yīng)用程序標準結(jié)構(gòu)的軟件框架;例如微軟VisualC++中包含的MFC框架(不僅僅是函數(shù)庫,還包含程序框架);

應(yīng)用程序框架是根據(jù)大量的研發(fā)經(jīng)驗總結(jié)出的一套切實可行的應(yīng)用程序建立模型。降低開發(fā)難度,提高程序的健壯性;需要投入一定的時間學(xué)習其使用方法;

編寫小程序時不需要對程序框架有很清楚的概念;編寫具有一定規(guī)模的程序時,使用一個好的程序框架顯得非常重要。?

應(yīng)用程序框架和設(shè)計模式設(shè)計模式(DesignPattern)?

設(shè)計模式是針對軟件設(shè)計中經(jīng)常發(fā)生的問題的通用的和可重用的解決方案。它是對如何解決一個問題的描述或模板,可以在多種不同場合下使用。 在LabVIEW中,設(shè)計模式是解決常見軟件設(shè)計問題的VI結(jié)構(gòu)。設(shè)計模式一般以模板的形式出現(xiàn),其目的為提高重用性、編程效率和質(zhì)量。 (LabVIEWStyleBook)?

應(yīng)用程序框架和設(shè)計模式設(shè)計模式?

設(shè)計模式促進了好的編程樣式。如果一個應(yīng)用程序中的所有VI都應(yīng)用了常用的設(shè)計模式,那么開發(fā)者們就可以很容易地識別、理解、維護和重用彼此的程序代碼。設(shè)計模式容易制作成模板,構(gòu)建程序時經(jīng)??梢詮哪0彘_始,按照自己的需求修改模板,而不是總是從頭建立程序。這樣將節(jié)約很多開發(fā)時間,并且確保所開發(fā)的所有VI結(jié)構(gòu)一致。在一個多個開發(fā)者協(xié)作的組織中,設(shè)計模式和模板有助于建立統(tǒng)一的標準,以確保整個組織的所有成員所研發(fā)軟件具有一致的高質(zhì)量。?

應(yīng)用程序框架和設(shè)計模式應(yīng)用程序框架vs.設(shè)計模式

設(shè)計模式包括解決各種軟件問題的通用方案,其范圍廣闊;應(yīng)用程序框架僅針對“應(yīng)用程序如何架構(gòu)”這一具體問題。

設(shè)計模式程序框架設(shè)計模式解決其他問題的設(shè)計模式

1.基于循環(huán)和分支結(jié)構(gòu)的程序框架輪詢(Polling)

在循環(huán)結(jié)構(gòu)中不斷查詢控件的狀態(tài),一旦判定發(fā)生用戶事件(例如按下一個按鈕)則執(zhí)行相應(yīng)的代碼。輪詢常用于按鈕按下操作的響應(yīng)。例1:響應(yīng)按下按鈕操作(輪詢)用戶界面事件模式“我需要輪詢用戶的操作,但是這樣會降低我程序的運行速度,并且有時我還檢測不到……”1.基于循環(huán)和分支結(jié)構(gòu)的程序框架

按鈕的“機械動作”—“釋放時觸發(fā)”:用戶按下按鈕后控件的值為真,在程序框圖上讀取該控件的真值之后,按鈕控件會自動彈起,恢復(fù)值為假,即一次按鈕按下操作只會引起程序讀取到一次真值;

等待函數(shù)的作用:決定循環(huán)執(zhí)行頻率/輪詢頻率(100毫秒為典型值);使用Windows的任務(wù)管理器,觀察有等待函數(shù)和沒有等待函數(shù)兩種情況下CPU的占用情況。例2:統(tǒng)計循環(huán)次數(shù)和按下按鈕次數(shù)(輪詢)如果去掉等待函數(shù)則“循環(huán)執(zhí)行次數(shù)”控件值很大,占用較多CPU資源1.基于循環(huán)和分支結(jié)構(gòu)的程序框架移位寄存器初始化為0,用于存儲”確定“按鈕按下次數(shù)移位寄存器的值每次循環(huán)都送入“確定按鈕按下次數(shù)”控件“確定按鈕”按下時移位寄存器值加1存儲循環(huán)執(zhí)行次數(shù)

1.基于循環(huán)和分支結(jié)構(gòu)的程序框架例3:生成波形和分析波形(輪詢)

自由游標

按下“生成波形”按鈕生成指定波形,之后按下“分析波形”按鈕求取波形的最大值和對應(yīng)x索引,將游標移動到最大值點1.基于循環(huán)和分支結(jié)構(gòu)的程序框架2.基于事件結(jié)構(gòu)的程序框架事件結(jié)構(gòu)+While循環(huán)

圖形化操作系統(tǒng)和應(yīng)用程序采用事件驅(qū)動的編程機制。程序開始后進入等待狀態(tài),等待某個事件發(fā)生后進入相應(yīng)處理代碼,處理結(jié)束后回到等待狀態(tài)。以下代碼中,用戶要求結(jié)束程序運行(按下“停止”按鈕)時,退出事件結(jié)構(gòu),結(jié)束While循環(huán),停止程序運行。

2.基于事件結(jié)構(gòu)的程序框架例4:響應(yīng)按下按鈕操作(事件結(jié)構(gòu))

2.基于事件結(jié)構(gòu)的程序框架例5:統(tǒng)計循環(huán)次數(shù)和按下按鈕次數(shù)(事件結(jié)構(gòu))

2.基于事件結(jié)構(gòu)的程序框架例6:生成波形和分析波形(事件結(jié)構(gòu))兩個按鈕輸入控件置于事件結(jié)構(gòu)內(nèi)“停止”:值改變事件分支未給出初始化代碼,最先執(zhí)行狀態(tài)機模式“我需要執(zhí)行一系列的事件步驟,但是步驟順序可通過編程決定的。”3.標準狀態(tài)機標準狀態(tài)機(StandardStateMachine)自動販賣機模型InitializeWaitChangeQuarterDimeNickelExitVendNoinputQuarterDepositedTotal<50Total>=50ChangeRequestedDimeDepositedNickelDepositedTotal<50Total<50Total>=50Total>=50Total>50Total=50基本三要素:狀態(tài)、事件、動作背景動態(tài)結(jié)構(gòu):允許不同的狀態(tài),按通過編程決定的順序進行執(zhí)行靜態(tài)順序結(jié)構(gòu)狀態(tài)機結(jié)構(gòu)對于一個最簡單的狀態(tài)機結(jié)構(gòu)而言,它是可以用順序結(jié)構(gòu)代替的;而對于相對復(fù)雜的狀態(tài)機結(jié)構(gòu)而言,卻可以作為測試流程的組織者和管理者。在LabVIEW下實現(xiàn)狀態(tài)機結(jié)構(gòu)While循環(huán)+Case結(jié)構(gòu)每一Case即為一個狀態(tài)當前狀態(tài)中需有決定下一狀態(tài)的判定代碼使用枚舉常量通過移位寄存器傳遞至下一狀態(tài)切換代碼工作流程初始狀態(tài)FIRSTSTATE下一狀態(tài)

執(zhí)行步驟移位寄存器用于傳遞狀態(tài)Case結(jié)構(gòu)對每一狀態(tài)都配備一個分支切換代碼根據(jù)執(zhí)行步驟中的結(jié)果來決定下一狀態(tài)枚舉常量

一個自定義的枚舉類型對應(yīng)一個狀態(tài)機中的狀態(tài)集合枚舉常量枚舉類型是一種允許程序員自定義元素的數(shù)據(jù)類型,它可以顯示數(shù)值對應(yīng)的具體含義,幫助程序員理解程序中使用的變量值。枚舉常量舉例控件選板“Modern”

1、枚舉控件、指示、常量

2、默認U16

3、修改EditItems

4、隱式與顯式類型轉(zhuǎn)換3.標準態(tài)機新建對話框,VI->基于模板->框架->設(shè)計模式->標準狀態(tài)機3.標準狀態(tài)機使用什么數(shù)據(jù)類型表示狀態(tài)機的狀態(tài)? 分支/條件結(jié)構(gòu)選擇器端子可接受數(shù)據(jù)類型:布爾(此處不適用),整數(shù),字符串,枚舉……1.整數(shù):不夠直觀,分支選擇器接入的變量意義不清楚;2.字符串:意義明確,但容易出現(xiàn)拼寫錯誤,引起程序執(zhí)行錯誤;解決辦法:建立可容納所有拼寫錯誤字符串的默認分支,彈出對話框警告自己;3.枚舉:意義明確,不易出現(xiàn)錯誤。①在前面板添加枚舉控件,在快“自定義類型”,保存自定義類捷菜單選擇高級->自定義…

3.標準狀態(tài)機建立和使用自定義枚舉類型

②編輯自定義枚舉類型所包含的 枚舉值,“控件類型”列表選擇

型控件(.ctl)在狀態(tài)機中使用自定義枚舉類型,類型定義改變時,所有實例自動更新③在框圖窗口函數(shù)選板,“SelectaVI…”,選擇已保存自定義控件④在框圖窗口添加自定義枚舉類型的常量3.標準狀態(tài)機3.標準狀態(tài)機3.標準狀態(tài)機等待狀態(tài)中,檢查三個按鈕控件的值,如果找到真值則進入對應(yīng)狀態(tài),否則回到等待狀態(tài)

初始化后立刻進入等待狀態(tài)檢查三個按鈕控件值的方法:建立布爾類型1維數(shù)組,查找真值,從輸出索引值判斷有(索引≥0)無(索引=-1)真值和有真值時真值的位置。有真值時,索引值+2,之后類型轉(zhuǎn)化為枚舉值等待函數(shù),降低查詢按鈕值時的CPU負荷

3.標準狀態(tài)機例7:生成波形和分析波形(標準狀態(tài)機)3.標準狀態(tài)機生成波形后,回到等待狀態(tài)分析波形后,回到等待狀態(tài)Stop狀態(tài)下退出循環(huán),結(jié)束程序運行

3.標準狀態(tài)機例8:生成波形和分析波形(帶事件結(jié)構(gòu)的狀態(tài)機)

其他模式“我希望同一時刻能夠處理多個消息事件,而不是下一個消息代碼必須等待上一次響應(yīng)完成后才能執(zhí)行”“我不希望消息排隊,等待很煩的,有時采集數(shù)據(jù)和記錄數(shù)據(jù)應(yīng)該同時進行的”。主從線程模式通常應(yīng)用于具有多個同時發(fā)生的并且擁有不同運行速率的線程的程序中。比如采集電壓同時寫入磁盤,采集速率1KHz,記錄則每5秒一次。1、數(shù)據(jù)通信采用全局變量、局域變量或共享變量;2、Stop為Switch模式3、有時會用到事件發(fā)生模塊Occurrence生產(chǎn)者/消費者“我需要可以同時間執(zhí)行的兩個過程,并且需保證它們不會互相影響執(zhí)行速度?!鄙a(chǎn)者/消費者全局變量、局域變量或共享變量的每次復(fù)制都是原始數(shù)據(jù)的一個副本,占據(jù)了大量的空間。實際上只需要使用一部分緩沖區(qū)作為數(shù)據(jù)存儲的中間部分,這需要借助隊列技術(shù)。存儲單元數(shù)據(jù)流入數(shù)據(jù)流出生產(chǎn)者/消費者具體做法最簡單模式在LabVIEW下實現(xiàn)生產(chǎn)者/消費者無數(shù)據(jù)相關(guān)的多個循環(huán)主/從關(guān)系在循環(huán)間實現(xiàn)通訊與同步工作流程主循環(huán)負責通知各個從循環(huán)是否執(zhí)行允許循環(huán)間異步執(zhí)行數(shù)據(jù)的非相關(guān)性實現(xiàn)多線程程序過程分解從循環(huán)1從循環(huán)2主循環(huán)實現(xiàn)循環(huán)間的數(shù)據(jù)通訊變量通知器隊列信號量集合隊列在隊列中添加元素從隊列中釋放元素Referencetoexistingqueueinmemory選擇隊列中元素的數(shù)據(jù)類型出列操作需要等待數(shù)據(jù)進入或者超時情況生產(chǎn)者/消費者循環(huán)后臺服務(wù)模式問:“我需要程序在后臺運行,不要前面板,不要交互”答:“采用VI屬性和方法接口,足以使你控制后臺運行的VI”

例子:一個網(wǎng)絡(luò)服務(wù)監(jiān)聽程序,程序只需要接收與客戶端Sockets的連接,實現(xiàn)三次握手,連接完成后將引用交給前端應(yīng)用程序處理,同時繼續(xù)監(jiān)聽。后臺服務(wù)模式后臺服務(wù)模式

4.生產(chǎn)者/消費者設(shè)計模式隊列(Queue)

一種特殊的數(shù)據(jù)結(jié)構(gòu);是按順序存儲的數(shù)據(jù)的集合,對于集合的主要操作是在集合尾部加入數(shù)據(jù)和從集合頭部移除數(shù)據(jù);FIFO(First-In-First-Out)。

4.生產(chǎn)者/消費者設(shè)計模式

4.生產(chǎn)者/消費者設(shè)計模式隊列典型函數(shù),函數(shù)選板,編程->同步->隊列操作1.獲取隊列引用(ObtainQueue)

功能:獲得隊列的引用。默認情況下,如果指定隊列已存在,獲得該隊列的引用;如果隊列未存在,則創(chuàng)建隊列。可以在程序的不同部分引用同一個隊列,即在兩端代碼之間共享和傳遞數(shù)據(jù)。

4.生產(chǎn)者/消費者設(shè)計模式2.元素入隊列(EnqueueElement)3.元素出隊列(DequeueElement)4.預(yù)覽隊列元素(PreviewQueueElement)功能:返回隊列頭元素,但不刪除元素。5.獲取隊列狀態(tài)(GetQueueStatus)功能:返回隊列狀態(tài)信息,如元素個數(shù)。-1(默認)時永遠等待4.生產(chǎn)者/消費者設(shè)計模式6.隊列最前端插入元素(EnqueueElementAtOppositeEnd)功能:在隊列頭插入元素(非標準操作,用于插入高優(yōu)先級元素)。7.清空隊列(FlushQueue)功能:清空隊列所有元素(并返回這些元素)。8.釋放隊列引用(ReleaseQueue)功能:釋放隊列的一個引用。

4.生產(chǎn)者/消費者設(shè)計模式例9:隊列操作示例入隊列兩個元素預(yù)覽/觀察隊列頭元素預(yù)覽操作不會刪除隊列元素在隊列頭插入元素隊列頭元素出隊列生產(chǎn)者,生產(chǎn)數(shù)據(jù)消費者,消費/使用數(shù)據(jù)數(shù)據(jù)

4.生產(chǎn)者/消費者設(shè)計模式什么是生產(chǎn)者/消費者設(shè)計模式(Producer/Consumerdesignpattern)?

兩個線程,一個生產(chǎn)數(shù)據(jù),另一個消費/使用數(shù)據(jù);在線程之間建立緩沖(采用隊列實現(xiàn)),確保消費者以自己的步調(diào)使用數(shù)據(jù),同時允許生產(chǎn)者將更多的數(shù)據(jù)添加到隊列中。

緩沖區(qū)(基于隊列,已填充一部分)

4.生產(chǎn)者/消費者設(shè)計模式消費者循環(huán),從緩沖取出數(shù)據(jù)消費者循環(huán),從緩沖取出數(shù)據(jù)使用隊列建立生產(chǎn)者和消費者之間的數(shù)據(jù)緩沖

4.生產(chǎn)者/消費者設(shè)計模式新建對話框,VI->基于模板->框架->設(shè)計模式->生產(chǎn)者/消費者設(shè)計模式(數(shù)據(jù))

生產(chǎn)者循環(huán), 向緩沖加入數(shù) 據(jù),入隊列 通過輪詢決定何時入隊列消費者循環(huán),從緩沖取出數(shù)據(jù)使用隊列建立生產(chǎn)者和消費者之間的數(shù)據(jù)緩沖

4.生產(chǎn)者/消費者設(shè)計模式新建對話框,VI->基于模板->框架->設(shè)計模式->生產(chǎn)者/消費者設(shè)計模式(事件)

生產(chǎn)者循環(huán), 向緩沖加入數(shù) 據(jù),入隊列 通過事件結(jié)構(gòu)入隊列消費者循環(huán),從緩沖取出數(shù)據(jù)初始化代碼

4.生產(chǎn)者/消費者設(shè)計模式

例10:生成波形和分析波形(生產(chǎn)者/消費者)

用事件結(jié)構(gòu)將動作/

操作入隊列“Initialize”首先入隊列4.生產(chǎn)者/消費者設(shè)計模式

用事件結(jié)構(gòu)將動作/

操作入隊列在消費者循環(huán)內(nèi),執(zhí)行相應(yīng)動作

4.生產(chǎn)者/消費者設(shè)計模式自定義枚舉類型,包含7個狀態(tài)采用屬性節(jié)點,指示燈位置初始化到(0,0)首先進入初始化狀態(tài)

4.生產(chǎn)者/消費者設(shè)計模式每隔100毫秒產(chǎn)生超時事件 入隊列出隊列 人為添加消費者 數(shù)據(jù)處理延時兩個循環(huán)都結(jié)束才釋放隊列/china/labviewtips應(yīng)用程序啟動模式“我想設(shè)計一個啟動畫面,同時顯示應(yīng)用程序加載的進度,加載完畢后退出啟動畫面,運行主程序”應(yīng)用程序啟動模式1、SubVI目錄

2、啟動應(yīng)用程序.vi

3、主程序“網(wǎng)絡(luò)實驗系統(tǒng).vi”代理模式“我希望頂層VI(主VI)需要某個子VI時,才將其載入內(nèi)存”“可以在應(yīng)用程序中引入遲載入技術(shù)”代理模式總結(jié)設(shè)計模式簡化LabVIEW開發(fā)過程被廣泛使用及證明其可用常用的LabVIEW設(shè)計模式數(shù)據(jù)流事件驅(qū)動狀態(tài)機結(jié)構(gòu)生產(chǎn)者/消費者

屬性節(jié)點屬性節(jié)點(Pr

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論