LabVIEW性能和內(nèi)存管理(中文)_第1頁(yè)
LabVIEW性能和內(nèi)存管理(中文)_第2頁(yè)
LabVIEW性能和內(nèi)存管理(中文)_第3頁(yè)
LabVIEW性能和內(nèi)存管理(中文)_第4頁(yè)
LabVIEW性能和內(nèi)存管理(中文)_第5頁(yè)
已閱讀5頁(yè),還剩42頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、LabVIEW的性能和內(nèi)存管理目標(biāo)目標(biāo) 理解理解LabVIEW的執(zhí)行系統(tǒng)的執(zhí)行系統(tǒng) 學(xué)習(xí)通過(guò)以下方式提高性能學(xué)習(xí)通過(guò)以下方式提高性能: 減少數(shù)據(jù)備份減少數(shù)據(jù)備份 減少總的內(nèi)存使用減少總的內(nèi)存使用 理解理解VI執(zhí)行屬性執(zhí)行屬性LabVIEW的執(zhí)行系統(tǒng)的執(zhí)行系統(tǒng) LabVIEW的執(zhí)行系統(tǒng)是的執(zhí)行系統(tǒng)是LabVIEW中負(fù)責(zé)實(shí)際運(yùn)行代碼的部中負(fù)責(zé)實(shí)際運(yùn)行代碼的部分分 支持自動(dòng)并行運(yùn)行支持自動(dòng)并行運(yùn)行 LabVIEW的獨(dú)特性的獨(dú)特性 其它編程語(yǔ)言需要手動(dòng)線程管理其它編程語(yǔ)言需要手動(dòng)線程管理LabVIEW執(zhí)行系統(tǒng)使你的代碼自動(dòng)并行運(yùn)行。在其它編程語(yǔ)言中如果需要并行運(yùn)行代碼必須手動(dòng)管理線程,但是LabVIE

2、W的編譯器和執(zhí)行系統(tǒng)在可能的情況下一起并行運(yùn)行代碼。大多數(shù)情況下,執(zhí)行系統(tǒng)的細(xì)節(jié)是無(wú)關(guān)緊要的,因?yàn)橄到y(tǒng)能夠在沒(méi)有干預(yù)的情況下自動(dòng)優(yōu)化執(zhí)行程序,但有些時(shí)候了解細(xì)節(jié)有助于理解執(zhí)行系統(tǒng)的工作方式,以便于提高程序性能。LabVIEW的執(zhí)行系統(tǒng)的執(zhí)行系統(tǒng)系統(tǒng)工作就像一個(gè)線程池系統(tǒng)工作就像一個(gè)線程池 程序工作就是一個(gè)隊(duì)列程序工作就是一個(gè)隊(duì)列 一系列線程從隊(duì)列中提取程序執(zhí)行代碼一系列線程從隊(duì)列中提取程序執(zhí)行代碼工作(隊(duì)列元素)就是執(zhí)行代碼片段工作(隊(duì)列元素)就是執(zhí)行代碼片段每一個(gè)隊(duì)列就是一個(gè)執(zhí)行系統(tǒng)每一個(gè)隊(duì)列就是一個(gè)執(zhí)行系統(tǒng) 用戶界面用戶界面I 標(biāo)準(zhǔn)標(biāo)準(zhǔn) 儀器儀器I/O 數(shù)據(jù)采集數(shù)據(jù)采集 其它其它1 其它其

3、它2 與調(diào)用方相同與調(diào)用方相同 定時(shí)循環(huán)定時(shí)循環(huán)LabVIEW執(zhí)行系統(tǒng)就像一個(gè)線程池。線程池是線程的集合,共同完成從共享隊(duì)列中提取的一系列工作。在LabVIEW中,工作被稱為“隊(duì)列元素”,每一個(gè)元素都代表一段需要被執(zhí)行的VI代碼。在LabVIEW中,實(shí)際上有6個(gè)執(zhí)行系統(tǒng),每一個(gè)系統(tǒng)都有自己獨(dú)立的隊(duì)列。此外每一個(gè)定時(shí)循環(huán)都有自己獨(dú)立的執(zhí)行系統(tǒng)。LabVIEW的執(zhí)行系統(tǒng)的執(zhí)行系統(tǒng) 每一個(gè)執(zhí)行系統(tǒng)有多個(gè)線程每一個(gè)執(zhí)行系統(tǒng)有多個(gè)線程 例外:用戶界面只有一個(gè)線程例外:用戶界面只有一個(gè)線程下圖顯示的是執(zhí)行系統(tǒng)如何工作的模型。模型中為每一個(gè)執(zhí)行系統(tǒng)(3個(gè))創(chuàng)建了一個(gè)隊(duì)列。放在隊(duì)列里面的數(shù)據(jù)代表需要編譯的VI

4、的執(zhí)行代碼。當(dāng)一個(gè)VI準(zhǔn)備運(yùn)行時(shí),LabVIEW將其放入對(duì)應(yīng)執(zhí)行系統(tǒng)的隊(duì)列中。每一個(gè)執(zhí)行系統(tǒng)有一個(gè)或多個(gè)線程。每一個(gè)線程都有一個(gè)循環(huán),這個(gè)循環(huán)從隊(duì)列中提取并執(zhí)行隊(duì)列元素代碼。用戶界面執(zhí)行系統(tǒng)只有一個(gè)線程,但是其它的執(zhí)行系統(tǒng)都有多個(gè)線程并共享同一個(gè)隊(duì)列。當(dāng)VI的代碼并行運(yùn)行時(shí),代碼在執(zhí)行系統(tǒng)的不同線程中被并行處理。LabVIEW的執(zhí)行系統(tǒng)的執(zhí)行系統(tǒng)LabVIEW塊運(yùn)算塊運(yùn)算Clump 1Clump 2Clump 0Clump 0LabVIEW塊運(yùn)算塊運(yùn)算LabVIEW使用搶先式和合作式的多線程機(jī)制。在編譯過(guò)程中,LabVIEW分析VI以定位可以在所謂的塊中一起執(zhí)行的節(jié)點(diǎn)組。每個(gè)優(yōu)先級(jí)和執(zhí)行系統(tǒng)組

5、合都有一個(gè)運(yùn)行隊(duì)列數(shù)據(jù)結(jié)構(gòu),保留哪些塊可以一起運(yùn)行。當(dāng)執(zhí)行系統(tǒng)激活線程時(shí),執(zhí)行系統(tǒng)從運(yùn)行隊(duì)列檢索并執(zhí)行塊。當(dāng)執(zhí)行系統(tǒng)完成運(yùn)行時(shí),它在運(yùn)行隊(duì)列上存儲(chǔ)滿足輸入條件的附加塊。這就允許程序框圖在任何可用的執(zhí)行線程中運(yùn)行。如果程序框圖具有足夠的并行性,則它可以在所有線程中同時(shí)執(zhí)行。LabVIEW不會(huì)將代碼塊永久分配給特定線程。LabVIEW可以在下次運(yùn)行VI時(shí)使用不同的線程執(zhí)行程序塊。由LabVIEW安排,每個(gè)塊產(chǎn)生一段代碼。在一個(gè)塊中,LabVIEW不提供并行性。在塊與塊之間,LabVIEW可以使用其執(zhí)行系統(tǒng)進(jìn)行多任務(wù)。Clump 2 SleepingClump 1 SleepingClump 0 S

6、leepingLabVIEW塊運(yùn)算塊運(yùn)算Completion of diagram:Divide nodes, display of indicators, then VI exit.Start of diagram:Reads controls, then schedules Clumps 1 and 2 Then sleeps.Bottom For LoopIndicator is updatedClump 0 Scheduled Sleep.Top For LoopIndicator is updatedClump 0 Scheduled Sleep.Clump 1Clump 2Clum

7、p 0LabVIEW塊運(yùn)算塊運(yùn)算上圖顯示的塊表示程序框圖的開始和結(jié)束。當(dāng)兩個(gè)“循環(huán)”執(zhí)行時(shí),該塊是“休眠”,同時(shí)它會(huì)被“喚醒”以結(jié)束VI(兩個(gè)除法函數(shù))。在有一個(gè)LabVIEW執(zhí)行系統(tǒng)情況下,VI會(huì)生成執(zhí)行代碼。在VI的數(shù)據(jù)空間中,每個(gè)塊有一個(gè)記錄,稱為Q元素。Q元素可以放在一個(gè)稱為“runQ”的隊(duì)列上,LabVIEW執(zhí)行系統(tǒng)使用它來(lái)安排相關(guān)的代碼段。休眠休眠當(dāng)節(jié)點(diǎn)當(dāng)節(jié)點(diǎn)“進(jìn)入休眠進(jìn)入休眠”時(shí),它將自身置于等待隊(duì)列上,然后返回到執(zhí)行時(shí),它將自身置于等待隊(duì)列上,然后返回到執(zhí)行系統(tǒng)系統(tǒng) 例如,隊(duì)列,子例如,隊(duì)列,子VI調(diào)用,調(diào)試等調(diào)用,調(diào)試等.當(dāng)它完成等待時(shí),從等待隊(duì)列釋放并放回執(zhí)行隊(duì)列當(dāng)它完成等

8、待時(shí),從等待隊(duì)列釋放并放回執(zhí)行隊(duì)列有時(shí)有時(shí)VI會(huì)通過(guò)停止執(zhí)行并返回隊(duì)列來(lái)將執(zhí)行權(quán)交給其它會(huì)通過(guò)停止執(zhí)行并返回隊(duì)列來(lái)將執(zhí)行權(quán)交給其它VI 例如,例如,While循環(huán)循環(huán)隊(duì)列元素跟蹤進(jìn)度,以便他們可以在停止的地方重新執(zhí)行隊(duì)列元素跟蹤進(jìn)度,以便他們可以在停止的地方重新執(zhí)行通常LabVIEW代碼中的一個(gè)節(jié)點(diǎn)必須等待某些事情,然后才能繼續(xù)。例如,隊(duì)列或子VI可能被另一個(gè)線程使用,或者在調(diào)試時(shí)單步執(zhí)行。在這些情況下,該隊(duì)列元素的VI代碼將被放入正在等待處理的等待隊(duì)列中。在將其放入等待隊(duì)列之后,VI代碼返回到它正在運(yùn)行的執(zhí)行系統(tǒng)線程,以便另一段代碼可以運(yùn)行。這被稱為協(xié)作多任務(wù)。當(dāng)?shù)却?duì)列上的代碼片段準(zhǔn)備好再

9、次運(yùn)行時(shí),它就從等待隊(duì)列中取出,然后放回到執(zhí)行系統(tǒng)隊(duì)列。最終(可能立即)該隊(duì)列元素將被再次從執(zhí)行隊(duì)列中取出并運(yùn)行。有時(shí)VI會(huì)自動(dòng)停止執(zhí)行,以允許其他代碼運(yùn)行。這是為了防止長(zhǎng)的循環(huán)占用所有的執(zhí)行時(shí)間。當(dāng)這種情況發(fā)生時(shí),VI代碼簡(jiǎn)單地返回到執(zhí)行系統(tǒng),根據(jù)需要立即將其放回隊(duì)列。在其他代碼有機(jī)會(huì)運(yùn)行之后,這段VI代碼將再次從隊(duì)列中取出并運(yùn)行。每當(dāng)一段VI代碼由于某種原因必須進(jìn)入休眠狀態(tài)時(shí),該代碼的隊(duì)列元素會(huì)跟蹤它停止的地方,以便下次調(diào)度時(shí)它可以在同一個(gè)地方開始。首選執(zhí)行系統(tǒng)首選執(zhí)行系統(tǒng) 一些節(jié)點(diǎn)必須在一些節(jié)點(diǎn)必須在UI線程中運(yùn)行線程中運(yùn)行 每個(gè)每個(gè)VI可以指定首選的執(zhí)行系統(tǒng)可以指定首選的執(zhí)行系統(tǒng) 默認(rèn)

10、值為默認(rèn)值為“與調(diào)用者相同與調(diào)用者相同”一些節(jié)點(diǎn)具有首選的執(zhí)行系統(tǒng)。最常見的首選執(zhí)行系統(tǒng)是UI線程。一些節(jié)點(diǎn)必須在UI線程上運(yùn)行。例如,VI中屬性節(jié)點(diǎn)、VI 中調(diào)用節(jié)點(diǎn)以及VI引用節(jié)點(diǎn)必須在UI線程中運(yùn)行。(此限制不適用于用于DAQ采集,LV類或其他類型的屬性/調(diào)用節(jié)點(diǎn)。)另外,每個(gè)VI可以指定首選的執(zhí)行系統(tǒng)。默認(rèn)值為“與調(diào)用者相同”,這意味著VI可以在任何執(zhí)行系統(tǒng)中運(yùn)行。切換執(zhí)行系統(tǒng)切換執(zhí)行系統(tǒng)當(dāng)節(jié)點(diǎn)想要運(yùn)行但是在錯(cuò)誤的執(zhí)行系統(tǒng)中時(shí),它使隊(duì)列元素“進(jìn)入睡眠”并在另一個(gè)執(zhí)行系統(tǒng)中喚醒。這意味著代碼將停止執(zhí)行,并將其放在一個(gè)運(yùn)行它的執(zhí)行系統(tǒng)隊(duì)列中。當(dāng)其他執(zhí)行系統(tǒng)有時(shí)間時(shí),它會(huì)將元素拉回隊(duì)列并執(zhí)行

11、它。此轉(zhuǎn)換需要時(shí)間,因此它可能是性能問(wèn)題的原因。為了避免這種情況,應(yīng)該盡量避免不必要的UI代碼(如VI屬性節(jié)點(diǎn)等),并為子VI指定首選執(zhí)行系統(tǒng)選項(xiàng)為“與調(diào)用者相同”。有兩種情況可能需要為VI使用特定的首選執(zhí)行系統(tǒng):1:如果VI有UI代碼,那么該代碼必須在UI線程中運(yùn)行。當(dāng)你使用“與調(diào)用者相同”時(shí),可能最終運(yùn)行在一個(gè)執(zhí)行系統(tǒng)而不是UI線程。這意味著VI必須切換執(zhí)行系統(tǒng)以獲取UI線程。然后,VI必須返回到它在調(diào)用UI線程之前啟動(dòng)的相同執(zhí)行系統(tǒng),因此它將必須進(jìn)行執(zhí)行系統(tǒng)切換。如果這發(fā)生在一個(gè)循環(huán)中,那么它就會(huì)顯著影響性能。如果將該VI標(biāo)記為首選的UI線程,則調(diào)用者可以在調(diào)用之前切換到UI線程。這可能

12、意味著切換僅在循環(huán)之前和之后發(fā)生,而不是每次發(fā)生。2:如果VI具有長(zhǎng)時(shí)間運(yùn)行的高優(yōu)先級(jí)循環(huán),用于處理類似數(shù)據(jù)采集的任務(wù),那么您可以將該VI標(biāo)記為在其他執(zhí)行系統(tǒng)(儀器I / O,數(shù)據(jù)采集,其他1或其他2 ),以便它不必與其他VI競(jìng)爭(zhēng)執(zhí)行系統(tǒng)的時(shí)間。注意,如果你不是在實(shí)時(shí)操作系統(tǒng)上運(yùn)行,你仍然需要擔(dān)心操作系統(tǒng)調(diào)度程序。使用定時(shí)循環(huán)來(lái)控制優(yōu)先級(jí)將更可靠,并且在實(shí)時(shí)操作系統(tǒng)上這樣做是確保您的代碼以正確的優(yōu)先級(jí)運(yùn)行的最可靠的方法。 優(yōu)先級(jí)優(yōu)先級(jí) 子子VI優(yōu)先級(jí)影響執(zhí)行系統(tǒng)中該優(yōu)先級(jí)影響執(zhí)行系統(tǒng)中該VI的隊(duì)列元素的優(yōu)先級(jí)。的隊(duì)列元素的優(yōu)先級(jí)。 優(yōu)先級(jí)較高的隊(duì)列元素首先被執(zhí)行優(yōu)先級(jí)較高的隊(duì)列元素首先被執(zhí)行

13、優(yōu)先級(jí)設(shè)置不影響執(zhí)行系統(tǒng)線程本身的優(yōu)先級(jí):優(yōu)先級(jí)設(shè)置不影響執(zhí)行系統(tǒng)線程本身的優(yōu)先級(jí): 執(zhí)行系統(tǒng)可能會(huì)搶占整個(gè)線程來(lái)運(yùn)行線程相對(duì)于另一執(zhí)行系統(tǒng)可能會(huì)搶占整個(gè)線程來(lái)運(yùn)行線程相對(duì)于另一個(gè)執(zhí)行系統(tǒng)(或其它進(jìn)程)個(gè)執(zhí)行系統(tǒng)(或其它進(jìn)程) 使用定時(shí)循環(huán)更可靠地控制優(yōu)先級(jí)。使用定時(shí)循環(huán)更可靠地控制優(yōu)先級(jí)。子程序優(yōu)先級(jí)子程序優(yōu)先級(jí) 子程序優(yōu)先級(jí)設(shè)置不是實(shí)際的優(yōu)先級(jí)。它不是改變隊(duì)列元素的優(yōu)先級(jí),子程序優(yōu)先級(jí)使整個(gè)VI是一個(gè)單獨(dú)的塊,它保證在開始執(zhí)行時(shí)不會(huì)進(jìn)入休眠。這意味著您不能調(diào)用任何可能導(dǎo)致VI在子程序VI中進(jìn)入休眠的功能,并且不能在VI中切換執(zhí)行系統(tǒng)。您只能調(diào)用也標(biāo)記為子程序優(yōu)先級(jí)的其他子VI。在子程序VI

14、中運(yùn)行的所有代碼都是串行的:在子程序VI中沒(méi)有并行性。 子程序還有另外一個(gè)有助于最高優(yōu)先級(jí)應(yīng)用程序的功能,右鍵單擊一個(gè)子VI并且從快捷菜單中選擇遇忙時(shí)忽略子程序調(diào)用,如果子程序正在另外一個(gè)線程運(yùn)行時(shí),執(zhí)行系統(tǒng)會(huì)跳過(guò)調(diào)用。這一功能可幫助執(zhí)行系統(tǒng)在時(shí)間緊迫的循環(huán)中安全跳過(guò)子程序的執(zhí)行操作,避免了等待完成子VI而導(dǎo)致的延時(shí)。如果跳過(guò)了子VI的執(zhí)行,所有子VI在前面板上的顯示控件的輸出將還原為默認(rèn)值。內(nèi)聯(lián)內(nèi)聯(lián)VI 優(yōu)先更換子程序優(yōu)先級(jí)優(yōu)先更換子程序優(yōu)先級(jí) 當(dāng)調(diào)用者被編譯時(shí),整個(gè)程序框圖被插入調(diào)用者:零調(diào)用當(dāng)調(diào)用者被編譯時(shí),整個(gè)程序框圖被插入調(diào)用者:零調(diào)用開銷開銷 零調(diào)用開銷零調(diào)用開銷 仍然可以包含并行

15、性仍然可以包含并行性 允許更多的編譯器優(yōu)化允許更多的編譯器優(yōu)化 限制限制: 無(wú)前面板訪問(wèn)無(wú)前面板訪問(wèn) 不是所有節(jié)點(diǎn)都允許不是所有節(jié)點(diǎn)都允許 強(qiáng)制調(diào)用者在每次修改子強(qiáng)制調(diào)用者在每次修改子VI時(shí)重新編譯時(shí)重新編譯線程阻塞線程阻塞 外部代碼(調(diào)用庫(kù)節(jié)點(diǎn),外部代碼(調(diào)用庫(kù)節(jié)點(diǎn),CIN,.Net,ActiveX)將在調(diào)用)將在調(diào)用期間阻塞線程期間阻塞線程 C代碼不使用代碼不使用LabVIEW的隊(duì)列元素,因此如果阻塞,則整個(gè)線程必的隊(duì)列元素,因此如果阻塞,則整個(gè)線程必須等待須等待. 在等待時(shí)不能運(yùn)行其他在等待時(shí)不能運(yùn)行其他VI代碼代碼. 通常不能中止通常不能中止 請(qǐng)參閱調(diào)用庫(kù)節(jié)點(diǎn)的請(qǐng)參閱調(diào)用庫(kù)節(jié)點(diǎn)的“回調(diào)

16、回調(diào)”選項(xiàng)卡選項(xiàng)卡雖然LabVIEW的執(zhí)行系統(tǒng)基于合作多線程,但是用其他語(yǔ)言編寫的代碼卻不是。這意味著當(dāng)你從LabVIEW調(diào)用外部代碼時(shí),代碼將消耗執(zhí)行線程,直到調(diào)用完成。如果外部代碼因?yàn)榛コ饣蚱渌蛐枰却?,那么在這個(gè)過(guò)程中其他VI代碼在這個(gè)執(zhí)行系統(tǒng)線程上也就不能運(yùn)行。此外,在大多數(shù)情況下,外部代碼不能中止,因此如果您嘗試在運(yùn)行外部代碼時(shí)中止VI,則必須在等待調(diào)用完成后才能完全停止VI。這是所謂的“重置VI”對(duì)話框彈出的最常見原因。如果你使用調(diào)用庫(kù)節(jié)點(diǎn)調(diào)用C代碼,那么檢查CLN屬性對(duì)話框的“回調(diào)”選項(xiàng)卡,就可以避免該問(wèn)題。連線語(yǔ)義連線語(yǔ)義 每根導(dǎo)線都是一個(gè)緩沖內(nèi)存器每根導(dǎo)線都是一個(gè)緩沖內(nèi)存

17、器 分支創(chuàng)建副本分支創(chuàng)建副本LabVIEW數(shù)據(jù)流編程模型的值語(yǔ)義意味著每條線都對(duì)其自己的數(shù)據(jù)副本進(jìn)行操作。子VI和內(nèi)置函數(shù)還創(chuàng)建其數(shù)據(jù)的副本。制作副本的好處是兩個(gè)代碼分支可以獨(dú)立操作數(shù)據(jù)。無(wú)需鎖定。如何優(yōu)化如何優(yōu)化理論上理論上5份成為份成為1份復(fù)印操作份復(fù)印操作CopyOutput is “inplace” with input我們前面的值語(yǔ)義示例表明可能有多達(dá)5個(gè)副本的數(shù)組。頂部分支被標(biāo)記為需要一個(gè)副本,因?yàn)樗鼘⑿薷臄?shù)組進(jìn)入+操作。底部分支被優(yōu)化以使用相同的數(shù)組用于*運(yùn)算和+運(yùn)算符的輸出。 LabVIEW已將5個(gè)副本優(yōu)化為1個(gè)副本。因?yàn)橛袃蓚€(gè)分支都想寫回?cái)?shù)組,因此理想的解決方案是需要復(fù)制一個(gè)

18、數(shù)組,而不管何種語(yǔ)言。同址操作同址操作 確定何時(shí)需要進(jìn)行復(fù)制確定何時(shí)需要進(jìn)行復(fù)制 數(shù)組和簇的權(quán)重高于其他類型數(shù)組和簇的權(quán)重高于其他類型 算法在執(zhí)行之前運(yùn)行算法在執(zhí)行之前運(yùn)行 不知道數(shù)組或字符串的大小不知道數(shù)組或字符串的大小 依賴于程序的順序方面依賴于程序的順序方面 分支機(jī)構(gòu)可能需要副本分支機(jī)構(gòu)可能需要副本確定何時(shí)需要進(jìn)行復(fù)制的算法稱為“同址”操作。該算法在VI中普遍存在并嘗試找到可以減少數(shù)組和簇復(fù)制的最佳代碼方式。在執(zhí)行之前“同址”操作已經(jīng)確定,因此就不知道一個(gè)數(shù)組是否大于另一個(gè)數(shù)組。自下而上自下而上同址信息通過(guò)調(diào)用層次結(jié)構(gòu)自下而上傳遞同址信息通過(guò)調(diào)用層次結(jié)構(gòu)自下而上傳遞Increments

19、array in placeCopy because of incrementNo copies requiredBranched wire顯示緩沖區(qū)分配顯示緩沖區(qū)分配同址優(yōu)化示例同址優(yōu)化示例對(duì)波形數(shù)組的每個(gè)元素進(jìn)行操作對(duì)波形數(shù)組的每個(gè)元素進(jìn)行操作這是一個(gè)如何使用“顯示緩沖區(qū)分配”工具來(lái)提高性能的示例。從層次結(jié)構(gòu)的高層開始,可以使用“顯示緩沖區(qū)分配”工具查看這些波形被復(fù)制三次。為了優(yōu)化這個(gè),我們需要深入到每個(gè)子VI并修復(fù)它們,使它們同址運(yùn)行。第一個(gè)子VI“同址”操作changes into這里我們可以使用元素同址操作結(jié)構(gòu)使子VI“同址”執(zhí)行。如果LabVIEW版本沒(méi)有元素同址操作結(jié)構(gòu),那么可以

20、通過(guò)將輸入波形連接到右側(cè)束波形節(jié)點(diǎn)(所謂的“魔術(shù)模式”)的頂部端子來(lái)獲得相同的效果。這給LabVIEW的同址操作一個(gè)提示,希望這兩個(gè)波形同址操作。第二個(gè)子VI“同址”操作changes into第三個(gè)子VI“同址”操作changes into最終結(jié)果:內(nèi)存緩沖點(diǎn)隱藏一旦打開這些子VI并修復(fù)了副本,然后保存它們(包括頂級(jí)VI),并再次使用顯示緩沖區(qū)分配工具,可以驗(yàn)證內(nèi)存緩沖點(diǎn)是否消失。注意,必須重新編譯Vis以更新緩沖區(qū)分配顯示??梢酝ㄟ^(guò)運(yùn)行VI,保存VI或按住Ctrl鍵并單擊運(yùn)行箭頭來(lái)執(zhí)行此操作。元素同址操作結(jié)構(gòu)元素同址操作結(jié)構(gòu)七種邊界操作類型七種邊界操作類型: 數(shù)組索引數(shù)組索引/替換替換 數(shù)

21、組拆分?jǐn)?shù)組拆分/替換子數(shù)組替換子數(shù)組 解綁解綁/捆綁簇捆綁簇 解綁解綁/捆綁波形捆綁波形 變體與元素轉(zhuǎn)換變體與元素轉(zhuǎn)換 原位輸入原位輸入/輸出邊界節(jié)點(diǎn)輸出邊界節(jié)點(diǎn) 數(shù)據(jù)值參考讀數(shù)據(jù)值參考讀/寫寫右鍵單擊左邊框或右邊框以添加同址操作右鍵單擊左邊框或右邊框以添加同址操作元素同址操作結(jié)構(gòu)使用多個(gè)邊界節(jié)點(diǎn)從各種數(shù)據(jù)結(jié)構(gòu)中提取數(shù)據(jù)。這些節(jié)點(diǎn)用于從數(shù)據(jù)結(jié)構(gòu)(包括數(shù)組,簇,波形和變量)中提取單個(gè)數(shù)據(jù)點(diǎn)。此外,同址輸入輸出邊界節(jié)點(diǎn)允許同址操作傳遞單個(gè)值。如果無(wú)法執(zhí)行在同址操作結(jié)構(gòu)中編寫的代碼,LabVIEW會(huì)進(jìn)行內(nèi)存復(fù)制。數(shù)組索引/替換子子數(shù)組和數(shù)據(jù)值參考讀/寫節(jié)點(diǎn)在LabVIEW 2009中是新的。數(shù)據(jù)值引

22、用是唯一的,我們將在本節(jié)后面討論該功能。前面板的內(nèi)存問(wèn)題前面板的內(nèi)存問(wèn)題 輸入控件和顯示控件有自輸入控件和顯示控件有自己的數(shù)據(jù)副本己的數(shù)據(jù)副本 如果前面板不在內(nèi)存中,如果前面板不在內(nèi)存中,則不需要內(nèi)存則不需要內(nèi)存 默認(rèn)數(shù)據(jù)會(huì)增加內(nèi)存使用默認(rèn)數(shù)據(jù)會(huì)增加內(nèi)存使用前面板輸入控件和顯示控件都有自己的數(shù)據(jù)副本,以便前面板編輯不會(huì)干擾計(jì)算。在上面所示示例中,Numeric+1與Numeric進(jìn)行同址操作。如果前面板和程序框圖共享此內(nèi)存空間,則執(zhí)行此代碼后前面板將具有與Numeric +1相同的值,但是顯然不是。某些控件(例如圖表和表)具有存儲(chǔ)大量默認(rèn)數(shù)據(jù)的能力,這可能會(huì)增加內(nèi)存使用量。 VI分析器有一個(gè)測(cè)

23、試以檢測(cè)該情況是否發(fā)生在應(yīng)用程序中。在調(diào)用子VI的情況下,除非需要,否則不要加載前面板。需要子VI前面板的實(shí)例將在本課后面討論。傳輸內(nèi)存緩沖區(qū)傳輸內(nèi)存緩沖區(qū)Operate BufferTransfer BufferExecution Buffer 傳輸緩沖區(qū)保護(hù)操作緩沖傳輸緩沖區(qū)保護(hù)操作緩沖區(qū)和執(zhí)行緩沖區(qū)之間的數(shù)區(qū)和執(zhí)行緩沖區(qū)之間的數(shù)據(jù)傳輸據(jù)傳輸 僅在前面板在內(nèi)存中時(shí)才僅在前面板在內(nèi)存中時(shí)才更新更新CopyCopy為了保護(hù)操作和執(zhí)行緩沖區(qū)之間的數(shù)據(jù)傳輸,LabVIEW使用傳輸緩沖區(qū)。當(dāng)使用大型數(shù)據(jù)集并且必須對(duì)該數(shù)據(jù)顯示操作時(shí),這可能會(huì)導(dǎo)致更多的內(nèi)存使用。傳輸緩沖區(qū)和執(zhí)行將在第5課“優(yōu)化執(zhí)行速度

24、”中討論。局部和全局變量局部和全局變量 局部變量更新數(shù)據(jù)傳輸緩沖區(qū)。局部變量更新數(shù)據(jù)傳輸緩沖區(qū)。 讀取局部或全局變量會(huì)導(dǎo)致數(shù)據(jù)副本讀取局部或全局變量會(huì)導(dǎo)致數(shù)據(jù)副本 盡可能使用連線傳輸數(shù)據(jù)盡可能使用連線傳輸數(shù)據(jù)請(qǐng)注意,在左側(cè)的示例中,當(dāng)使用連線傳輸數(shù)據(jù)時(shí),只需要1個(gè)緩沖區(qū)分配。如果從控件的局部變量讀取,則會(huì)進(jìn)行復(fù)制。在此示例中,將有三個(gè)副本,每個(gè)副本用于讀取每個(gè)局部變量。同樣,如果局部變量包含一個(gè)大的簇或數(shù)組,這更為重要。請(qǐng)注意,即使正在讀取并寫入同一個(gè)變量,這也適用。局部變量永遠(yuǎn)不能同址操作,因?yàn)榫植孔兞靠赡荜P(guān)系到傳輸緩沖區(qū),同時(shí)不能對(duì)傳輸緩沖區(qū)進(jìn)行同址操作。局部變量與局部變量與VI服務(wù)器屬性

25、節(jié)點(diǎn)服務(wù)器屬性節(jié)點(diǎn)局部變量局部變量 可以在任何線程中運(yùn)行 復(fù)制到/從傳輸緩沖區(qū) 如果前面板在內(nèi)存中,寫入會(huì)導(dǎo)致第二次復(fù)制到操作緩沖區(qū)中(如果可能,請(qǐng)避免此操作) 當(dāng)速度很重要時(shí)使用屬性節(jié)點(diǎn)屬性節(jié)點(diǎn) 必須在UI線程中運(yùn)行 復(fù)制到/從操作緩沖區(qū) 寫入導(dǎo)致第二副本進(jìn)入傳輸緩沖區(qū) 強(qiáng)制在內(nèi)存中的前面板 當(dāng)需要同步顯示時(shí)使用如果可能,請(qǐng)避免兩者同時(shí)使用如果可能,請(qǐng)避免兩者同時(shí)使用此處列出的規(guī)則顯式用于VI 服務(wù)器屬性節(jié)點(diǎn),但它們不適用于用于DAQ,LV類等的屬性節(jié)點(diǎn)。數(shù)據(jù)值引用數(shù)據(jù)值引用對(duì)數(shù)據(jù)的引用操作,而不是數(shù)據(jù)本身對(duì)數(shù)據(jù)的引用操作,而不是數(shù)據(jù)本身Data CopyData CopyDataRefer

26、enceReferenceReferenceTraditional dataflow: branches may create copiesBy reference: points to memory location分支線可能導(dǎo)致線上產(chǎn)生數(shù)據(jù)副本。如果多個(gè)分支修改該值,或者如果在其他分支使用原始值之前一個(gè)分支進(jìn)行修改時(shí),則會(huì)產(chǎn)生數(shù)據(jù)副本。數(shù)據(jù)值引用(DVR)允許您操作數(shù)據(jù)而不進(jìn)行復(fù)制。這在處理性能關(guān)鍵型應(yīng)用程序中的大型數(shù)組時(shí)特別有用??紤]這種情況:您通過(guò)電子郵件與朋友分享視頻。如果您將整個(gè)視頻包括在電子郵件中,朋友們會(huì)感到煩惱,因?yàn)樵撐募加昧怂麄兪占渲械目臻g。因此,您在線上包含視頻位置的

27、鏈接。由于所有收件人都會(huì)在線參考相同的位置,因此所有收件者都會(huì)看到視頻的最新版本(如果已修改)。數(shù)據(jù)值引用數(shù)據(jù)值引用 作為對(duì)數(shù)據(jù)的引用,而不是完整的數(shù)據(jù)本身作為對(duì)數(shù)據(jù)的引用,而不是完整的數(shù)據(jù)本身 可以保護(hù)對(duì)數(shù)據(jù)的訪問(wèn)可以保護(hù)對(duì)數(shù)據(jù)的訪問(wèn)LabVIEW 2009中引入的數(shù)據(jù)值引用和單元素隊(duì)列是傳輸大型數(shù)據(jù)集的非常有效的方法。在第4課“優(yōu)化內(nèi)存”中了解有關(guān)這些結(jié)構(gòu)的更多信息,值得一提的是,因?yàn)樗鼈兛捎糜谠谡麄€(gè)VI層次中移動(dòng)大型數(shù)據(jù)集,同時(shí)最大限度地減少內(nèi)存使用。重要的是要注意,必須使用元素同址操作結(jié)構(gòu)來(lái)訪問(wèn)數(shù)據(jù)值引用的數(shù)據(jù)。內(nèi)存分配內(nèi)存分配如果執(zhí)行以下操作,請(qǐng)如果執(zhí)行以下操作,請(qǐng)預(yù)先分配數(shù)組預(yù)先分

28、配數(shù)組: 有條件地向數(shù)組添加值有條件地向數(shù)組添加值 可以確定數(shù)組大小的上可以確定數(shù)組大小的上限限對(duì)于While循環(huán),由于數(shù)組的大小未知,故自動(dòng)索引并不十分有效。但是,在While循環(huán)中使用自動(dòng)索引能以較大的遞增量增加輸出數(shù)組的大小,從而避免每循環(huán)一次便需調(diào)整輸出數(shù)組的大小。當(dāng)循環(huán)執(zhí)行完畢,輸入數(shù)組便被調(diào)整為合適的大小。自動(dòng)索引在While循環(huán)和For循環(huán)中的運(yùn)行原理大體相同。自動(dòng)索引假定在每輪循環(huán)有一個(gè)值添加到數(shù)組。如必須有條件地將值添加到數(shù)組,而數(shù)組大小卻有其上限,可考慮預(yù)先分配數(shù)組并使用替換數(shù)組子集來(lái)填充數(shù)組。數(shù)組值填充完畢后,可將數(shù)組調(diào)整至合適的大小。數(shù)組僅創(chuàng)建一次,“替換數(shù)組子集”可將

29、輸入緩沖區(qū)重復(fù)用于輸出緩沖區(qū)。這與在循環(huán)中使用自動(dòng)索引的運(yùn)行原理極為相似。由于“替換數(shù)組子集”無(wú)法重新調(diào)整數(shù)組大小,故在執(zhí)行該操作時(shí),應(yīng)注意進(jìn)行值替換的數(shù)組的大小是否足以裝入所有數(shù)據(jù)。上面的示例顯示了此過(guò)程。使用上圖中的方法可以避免大量的內(nèi)存重新分配。替換數(shù)組子集函數(shù)有效地運(yùn)行,因?yàn)樗鎿Q了預(yù)分配的數(shù)組中的值。防止內(nèi)存重新分配的最佳方法是確定陣列中將有多少個(gè)元素,然后分配足夠的內(nèi)存。條件輸入控件條件輸入控件 Case結(jié)構(gòu)或結(jié)構(gòu)或For循環(huán)中的顯示控件循環(huán)中的顯示控件 防止防止LabVIEW重復(fù)使用數(shù)據(jù)緩沖區(qū)重復(fù)使用數(shù)據(jù)緩沖區(qū)特定的程序框圖可阻止LabVIEW重復(fù)使用數(shù)據(jù)緩沖區(qū)。在子VI中通過(guò)一

30、個(gè)條件顯示控件能阻止LabVIEW對(duì)數(shù)據(jù)緩沖區(qū)的使用進(jìn)行優(yōu)化。條件顯示控件是一個(gè)置于條件結(jié)構(gòu)或For循環(huán)中的顯示控件。如將顯示控件放置于一個(gè)按條件執(zhí)行的代碼路徑中,將中斷數(shù)據(jù)在系統(tǒng)中的流動(dòng),同時(shí)LabVIEW也不再重新使用輸入的數(shù)據(jù)緩沖區(qū)而將數(shù)據(jù)強(qiáng)制復(fù)制到顯示控件中。原因是,如果不執(zhí)行該條件路徑,為了更新顯示控件,LabVIEW必須將默認(rèn)數(shù)據(jù)傳遞給顯示控件。如將顯示控件置于條件結(jié)構(gòu)或For循環(huán)外,LabVIEW將直接修改循環(huán)或結(jié)構(gòu)中的數(shù)據(jù),將數(shù)據(jù)傳遞到顯示控件而不再?gòu)?fù)制一份數(shù)據(jù)??蔀榻惶姘l(fā)生的條件分支創(chuàng)建常量,避免將顯示控件置于條件結(jié)構(gòu)內(nèi)。在VI 分析器中,找到框圖性能測(cè)試。在子程序測(cè)試中啟用

31、有線終端以識(shí)別代碼中的條件指示符。這在LabVIEW幫助的VI內(nèi)存使用主題中有描述。數(shù)據(jù)空間數(shù)據(jù)空間 VI的數(shù)據(jù)存儲(chǔ)在其數(shù)據(jù)空間中的數(shù)據(jù)存儲(chǔ)在其數(shù)據(jù)空間中 每個(gè)每個(gè)VI都有自己的數(shù)據(jù)空間都有自己的數(shù)據(jù)空間 可重入可重入VI有多個(gè)數(shù)據(jù)空間有多個(gè)數(shù)據(jù)空間重入和數(shù)據(jù)空間重入和數(shù)據(jù)空間當(dāng)VI是“可重入”時(shí),它可以同時(shí)調(diào)用多次。它可以通過(guò)復(fù)制數(shù)據(jù)空間,使每個(gè)并發(fā)調(diào)用有自己的副本。在LabVIEW 8.5之前,我們只有兩個(gè)重入的設(shè)置:打開或關(guān)閉。在8.5中,我們添加了一種稱為“共享克隆”的新的重入。如果VI不可重入,則一次只能執(zhí)行一次調(diào)用,因?yàn)樵揤I只有一個(gè)數(shù)據(jù)空間。這使得內(nèi)存使用更低,并且允許VI使用未

32、初始化的移位寄存器(LV2風(fēng)格全局變量的基礎(chǔ))在調(diào)用之間保存狀態(tài)。將VI標(biāo)記為可重入時(shí),默認(rèn)值為“預(yù)分配克隆”。這意味著該VI的每一次調(diào)用都有自己的唯一數(shù)據(jù)空間。因此,調(diào)用時(shí)從不必等待另一個(gè)調(diào)用執(zhí)行完。然而,如果VI被多次調(diào)用和/或它具有大的數(shù)據(jù)空間,這可能導(dǎo)致存儲(chǔ)器使用的大量增加。如果在標(biāo)記為可重入的層次結(jié)構(gòu)中有多個(gè)VI,則會(huì)產(chǎn)生此效果。有些情況下,有人將系統(tǒng)中的每個(gè)VI都標(biāo)記為可重入,并且最終導(dǎo)致了成千上萬(wàn)的某些VI的克隆,最終導(dǎo)致LabVIEW內(nèi)存不足。仔細(xì)選擇要標(biāo)記為可重入的VI:專注于那些經(jīng)常調(diào)用并同時(shí)調(diào)用的VI。重入的新選項(xiàng)稱為“共享克隆”,在內(nèi)部通常稱為“池化”重入。使用此設(shè)置,

33、VI有一個(gè)數(shù)據(jù)空間池,每個(gè)調(diào)用從池中獲取一個(gè)數(shù)據(jù)空間。如果池中的所有數(shù)據(jù)空間都在使用,那么將創(chuàng)建一個(gè)新的數(shù)據(jù)空間并將其添加到池中。這具有不可重入和完全可重入的VI的一些好處:內(nèi)存使用率較低,因?yàn)槟恍枰c同時(shí)調(diào)用一樣多的數(shù)據(jù)空間,并且子VI調(diào)用不必等待其他調(diào)用完成。然而,他們可能不得不等待分配一個(gè)新的數(shù)據(jù)空間。缺點(diǎn)是存儲(chǔ)在VI中的任何狀態(tài)(例如,在移位寄存器中)與數(shù)據(jù)空間相關(guān)聯(lián),并且每個(gè)調(diào)用可能獲得不同的數(shù)據(jù)空間。這使得共享重入對(duì)于全局變量是一個(gè)壞主意。使用遞歸時(shí),必須將遞歸VI配置為使用共享克隆。這允許每個(gè)遞歸調(diào)用有一個(gè)新的數(shù)據(jù)空間,以便它永遠(yuǎn)不會(huì)阻塞和不使用無(wú)限內(nèi)存。數(shù)據(jù)空間內(nèi)容數(shù)據(jù)空間內(nèi)

34、容 一個(gè)大的數(shù)據(jù)塊一個(gè)大的數(shù)據(jù)塊 執(zhí)行系統(tǒng)隊(duì)列元素結(jié)構(gòu)執(zhí)行系統(tǒng)隊(duì)列元素結(jié)構(gòu) 執(zhí)行數(shù)據(jù):執(zhí)行數(shù)據(jù): 連線連線 臨時(shí)數(shù)據(jù)臨時(shí)數(shù)據(jù) 移位寄存器移位寄存器數(shù)據(jù)空間內(nèi)容數(shù)據(jù)空間內(nèi)容兩種類型兩種類型: “頂層頂層” 直接存儲(chǔ)在數(shù)據(jù)空間中直接存儲(chǔ)在數(shù)據(jù)空間中 數(shù)字,簇,數(shù)組和字符串句柄等數(shù)字,簇,數(shù)組和字符串句柄等 “具體具體” 不直接存儲(chǔ)在數(shù)據(jù)空間中不直接存儲(chǔ)在數(shù)據(jù)空間中 由頂級(jí)分配引用由頂級(jí)分配引用 可以是可變長(zhǎng)度可以是可變長(zhǎng)度 數(shù)組和字符串內(nèi)容數(shù)組和字符串內(nèi)容當(dāng)考慮數(shù)據(jù)空間的內(nèi)容時(shí),有時(shí)重要的是區(qū)分?jǐn)?shù)據(jù)空間中的兩種類型的數(shù)據(jù)。頂級(jí)數(shù)據(jù)是直接存儲(chǔ)在數(shù)據(jù)空間中的數(shù)據(jù)。例如,數(shù)據(jù)空間中的每個(gè)數(shù)字都是數(shù)據(jù)空間

35、中的簡(jiǎn)單分配,占用該數(shù)字所需的字節(jié)數(shù)。簇也直接存儲(chǔ)在數(shù)據(jù)空間中。但是,某些類型的數(shù)據(jù)不會(huì)直接存儲(chǔ)在數(shù)據(jù)空間中。最值得注意的是,數(shù)組和字符串內(nèi)容不存儲(chǔ)在數(shù)據(jù)空間中。相反,數(shù)據(jù)空間本身包含一個(gè)指向?qū)嶋H數(shù)據(jù)的指針,它存儲(chǔ)在其他地方。這樣做使得數(shù)據(jù)可以是可變大小的。這是很重要的,因?yàn)楫?dāng)你使用“顯示緩沖區(qū)分配”,你只看到頂級(jí)分配。點(diǎn)表示直接在數(shù)據(jù)空間中的分配。它們不顯示何時(shí)調(diào)整數(shù)組大小,有時(shí)可能會(huì)看到一個(gè)只在錯(cuò)誤使用情況下的分配。也就是說(shuō),不是所有的緩沖區(qū)分配點(diǎn)都會(huì)引起性能問(wèn)題,并且也不是每個(gè)由分配引起的性能問(wèn)題都會(huì)顯示為緩沖區(qū)分配點(diǎn)。LabVIEW內(nèi)存釋放內(nèi)存釋放 當(dāng)VI空閑時(shí),LabVIEW釋放許多

36、引用,而當(dāng)進(jìn)程關(guān)閉時(shí),LabVIEW釋放其他引用 手動(dòng)關(guān)閉引用以避免不希望的內(nèi)存增長(zhǎng),特別是對(duì)于長(zhǎng)時(shí)間運(yùn)行的應(yīng)用程序當(dāng)頂層VI打開的引用(本VI)空閑時(shí)或LabVIEW退出時(shí),LabVIEW會(huì)自動(dòng)關(guān)閉引用。 一些在本VI空閑時(shí)關(guān)閉的引用類型包括:文件引用,隊(duì)列和ActiveX引用。 其他引用(例如VISA和IVI)在LabVIEW退出之前不會(huì)關(guān)閉。作為一個(gè)程序員,在程序運(yùn)行期間關(guān)閉引用仍然是一個(gè)好方法,有下面幾個(gè)原因。 如果有一個(gè)長(zhǎng)時(shí)間運(yùn)行的程序,重復(fù)打開引用而不關(guān)閉引用可能會(huì)導(dǎo)致內(nèi)存問(wèn)題,因?yàn)槊總€(gè)引用都需要內(nèi)存。 此外,與外部代碼相關(guān)的任何引用都應(yīng)手動(dòng)關(guān)閉,以確保以特定順序執(zhí)行關(guān)閉過(guò)程,以避

37、免崩潰和其他可能的損壞。 在大多數(shù)其他開發(fā)環(huán)境中,無(wú)法關(guān)閉引用通常會(huì)導(dǎo)致在關(guān)閉應(yīng)用程序時(shí)發(fā)生崩潰或內(nèi)存泄漏。用戶界面的內(nèi)存使用用戶界面的內(nèi)存使用 UI上的每個(gè)控件都需要內(nèi)存才能存儲(chǔ)數(shù)據(jù)結(jié)構(gòu) 在運(yùn)行時(shí),控件和顯示控件數(shù)據(jù)是塊圖數(shù)據(jù)的附加副本 控件的默認(rèn)數(shù)據(jù)可能會(huì)導(dǎo)致不必要的內(nèi)存使用 子VI 的界面通常不會(huì)有助于內(nèi)存使用LabVIEW中最受忽視的內(nèi)存使用區(qū)域之一是前面板。在加載前面板時(shí),LabVIEW必須分配足夠的內(nèi)存來(lái)存儲(chǔ)所有數(shù)據(jù)結(jié)構(gòu)和默認(rèn)數(shù)據(jù)。每個(gè)控件在框圖上包含單獨(dú)的數(shù)據(jù)副本,因此內(nèi)存密集型應(yīng)用程序應(yīng)避免顯示大量數(shù)據(jù),除非需要,以避免內(nèi)存不足。如果你有一個(gè)非常大的前面板有非常大的控件,如一個(gè)

38、具有30,000個(gè)元素的數(shù)組,那么該前面板需要更多的內(nèi)存才能加載。大型默認(rèn)數(shù)據(jù)可能會(huì)增加內(nèi)存使用率和加載時(shí)間。使用VI Analyzer工具包中的“數(shù)組默認(rèn)值”測(cè)試來(lái)識(shí)別默認(rèn)數(shù)據(jù)不必要地對(duì)內(nèi)存使用做出貢獻(xiàn)的情況。避免為頂層VI創(chuàng)建單個(gè),單片式前面板。組合功能(如子面板控件和動(dòng)態(tài)加載的VI)合理使用時(shí)可減少應(yīng)用程序的內(nèi)存使用量。除非需要或手動(dòng)加載,否則子VI通常不會(huì)將其前面板加載到內(nèi)存中,因此,子VI的前面板的內(nèi)存使用通常不會(huì)影響應(yīng)用程序的內(nèi)存使用。子子VI和內(nèi)存使用和內(nèi)存使用執(zhí)行系統(tǒng)在以下條件下復(fù)制子執(zhí)行系統(tǒng)在以下條件下復(fù)制子VI的控制和顯示控件的控制和顯示控件數(shù)據(jù)數(shù)據(jù): 前面板在內(nèi)存中前面板在內(nèi)存中 前面板使用數(shù)據(jù)打印前面板使用數(shù)據(jù)打印 框圖使用引用前面板控件框圖使用引用前面板控件/顯示控件的屬性節(jié)點(diǎn)顯示控件的屬性節(jié)點(diǎn) VI使用局部變量使用局部變量 前面板使用數(shù)據(jù)記錄前面板使用數(shù)據(jù)記錄如果調(diào)用子VI,只有其編譯的代碼被加載到內(nèi)存中,除非前面板需要執(zhí)行。 由于各種原因,前面板信息可能在存儲(chǔ)器中。 其中一些項(xiàng)目需要內(nèi)存中的前面板信息才能正常工作。 也可以將子VI配置為在調(diào)用時(shí)打開前面板。在操作菜單中,可以啟用完成時(shí)打印和完成時(shí)記錄。減少內(nèi)存使用的提示減少內(nèi)存使用

溫馨提示

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

評(píng)論

0/150

提交評(píng)論