LabVIEW程序設(shè)計(jì)模式(五)—生產(chǎn)者/消費(fèi)者模式(4)
如圖 37所示,將整個(gè)過(guò)程與供水系統(tǒng)進(jìn)行類比,在數(shù)據(jù)產(chǎn)生/采集端(供水局)產(chǎn)生數(shù)據(jù)后,并不直接向終端用戶供水,因?yàn)榍罢弋a(chǎn)生水的速率與后者消耗水的速率并不相同。此時(shí)需要建造蓄水池將供水局產(chǎn)生的水放入到蓄水池中,同理獲取的數(shù)據(jù)也放入該緩沖區(qū)中。當(dāng)終端用戶需要用水時(shí),直接從蓄水池中獲取就可以了,同理在進(jìn)行數(shù)據(jù)顯示和分析時(shí)直接從數(shù)據(jù)緩沖區(qū)中獲取就可以了。
圖 37 生產(chǎn)者/消費(fèi)者模型
當(dāng)然,上面的模型也會(huì)存在一個(gè)問(wèn)題:數(shù)據(jù)緩沖區(qū)/蓄水池的容量?假定供水局不停地產(chǎn)生自來(lái)水,而終端用戶卻不消耗水,這樣便會(huì)導(dǎo)致蓄水池裝滿而溢出。反之當(dāng)終端用戶耗水量太大時(shí),導(dǎo)致沒(méi)有水可用。LabVIEW中的隊(duì)列函數(shù)提供了一種很好的方式規(guī)避了這個(gè)問(wèn)題,由于隊(duì)列中的元素是“先進(jìn)先出”的,因此確保了接收到的數(shù)據(jù)是有序的。在LabVIEW的隊(duì)列操作中(入列和出列函數(shù)),提供了timeout選項(xiàng)以處理數(shù)據(jù)緩沖區(qū)的溢出或不足。當(dāng)數(shù)據(jù)溢出時(shí),入列函數(shù)(數(shù)據(jù)進(jìn)入隊(duì)列)將停止發(fā)送數(shù)據(jù)(處于等待狀態(tài)),直到緩沖區(qū)存在數(shù)據(jù)空間或者達(dá)到了timeout設(shè)置的時(shí)間;而當(dāng)數(shù)據(jù)不足時(shí),出列函數(shù)(數(shù)據(jù)流出隊(duì)列)將停止接收數(shù)據(jù)(處于等到狀態(tài)),直到緩沖區(qū)進(jìn)入了新的數(shù)據(jù)或者達(dá)到了timeout設(shè)置的時(shí)間。
【應(yīng)用6】
本例將演示生產(chǎn)者/消費(fèi)者循環(huán)的一些基本特性和隊(duì)列操作的特點(diǎn)。如圖 38所示,生產(chǎn)者與消費(fèi)者之間傳遞的數(shù)據(jù)是一個(gè)連續(xù)的sine波形,二者靠大小為20個(gè)點(diǎn)的緩沖區(qū)連接。右下角是“停止”按鈕,用戶控制程序的停止執(zhí)行。例程提供了操作方式控件控制生產(chǎn)者和消費(fèi)者的數(shù)據(jù)傳遞速率,包含五種狀態(tài):不生產(chǎn),只消費(fèi)、生成快于消費(fèi)、生成速率等于消費(fèi)速率、生成慢于消費(fèi)、只生產(chǎn),不消費(fèi)。
圖 38 生產(chǎn)者/消費(fèi)者例程的前面板
圖 39所示為生產(chǎn)者/消費(fèi)者例程的背面板,代碼由3個(gè)循環(huán)組成,依上而下分別是生產(chǎn)者循環(huán)(產(chǎn)生sine數(shù)據(jù))、消費(fèi)者循環(huán)(獲取sine數(shù)據(jù))和狀態(tài)循環(huán)(獲得緩存區(qū)中數(shù)據(jù)的數(shù)據(jù)量)。例程假定正常的數(shù)據(jù)發(fā)送和接收的速率是延時(shí)50ms,當(dāng)需要某一段的速率減慢時(shí)需要將循環(huán)的延時(shí)設(shè)置為100ms。
例程將入列和出列函數(shù)的timeout設(shè)置為-1,表示如果沒(méi)有滿足條件進(jìn)行入列和出列操作,循環(huán)將處于持續(xù)等待狀態(tài)。在新建隊(duì)列時(shí),設(shè)置了緩沖區(qū)的大小是20個(gè)元素(圖中的紅色圓圈內(nèi))。最下面的循環(huán)是為了實(shí)時(shí)查看隊(duì)列緩沖區(qū)中存儲(chǔ)的元素?cái)?shù)量。
圖 39 生產(chǎn)者/消費(fèi)者例程的背面板
運(yùn)行該VI,默認(rèn)的操作方式是“生產(chǎn)速率等于消費(fèi)速率”,從圖 40中可以看出生產(chǎn)者循環(huán)和消費(fèi)者循環(huán)的數(shù)據(jù)是同步的,此時(shí)緩沖區(qū)內(nèi)沒(méi)有數(shù)據(jù),也就是說(shuō)產(chǎn)生的數(shù)據(jù)都被實(shí)時(shí)地消耗了。
圖 40 生產(chǎn)速率等于消費(fèi)速率
如果再將操作方式設(shè)置為“生成快于消費(fèi)”,可以看出數(shù)據(jù)緩沖區(qū)內(nèi)將逐漸變滿并保持為20個(gè)元素。此時(shí)生產(chǎn)者的波形將會(huì)比消費(fèi)者多20個(gè)數(shù)據(jù)點(diǎn)(這些點(diǎn)保存在數(shù)據(jù)緩沖區(qū)中),如圖 41所示。
評(píng)論