0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

labview中事件回調(diào)的使用

lvxisi ? 來(lái)源:lvxisi ? 作者:lvxisi ? 2023-08-24 16:38 ? 次閱讀

最近測(cè)試了labview調(diào)用dll中的回調(diào)函數(shù)相關(guān)功能,遇到了一些問(wèn)題,現(xiàn)在做一下整理和總結(jié),相關(guān)的內(nèi)容比較多,分多篇來(lái)寫。

在LabVIEW中,新手經(jīng)常將所有的程序放在事件結(jié)構(gòu)中來(lái)執(zhí)行,有時(shí)還不取消前面板鎖定,一個(gè)事件觸發(fā)沒(méi)有執(zhí)行完成時(shí),又去執(zhí)行另外一個(gè)事件,導(dǎo)致界面鎖死,必須從任務(wù)管理器里面關(guān)閉程序才行。

wKgZomTnFqOAMqVvAAKtoIyqNeY810.jpg

進(jìn)一步優(yōu)化,會(huì)采用生產(chǎn)者-消費(fèi)者結(jié)構(gòu),在事件結(jié)構(gòu)中觸發(fā),在消費(fèi)者循環(huán)中,處理相關(guān)的程序。但如果要處理的程序時(shí)間較長(zhǎng),還是會(huì)導(dǎo)致隊(duì)列阻塞,不能及時(shí)處理相應(yīng)的程序。此時(shí),便可以采用事件回調(diào)的方式來(lái)來(lái)解決。

wKgZomTnFqOALZiXAALB0o0_JfI308.jpg

先簡(jiǎn)單介紹一下回調(diào)函數(shù),是一種在編程中常見的概念,它通常用于在特定事件發(fā)生時(shí)執(zhí)行預(yù)定義的操作?;卣{(diào)函數(shù)可以作為參數(shù)傳遞給其他函數(shù),以便在需要時(shí)被調(diào)用,從而實(shí)現(xiàn)定制的事件處理和邏輯分離。詳細(xì)的概念網(wǎng)上很多,可以感興趣可以查一下。

在labview中,無(wú)法實(shí)現(xiàn)將函數(shù)的地址指針傳遞給dll的,實(shí)際測(cè)試過(guò)VI引用是不可以的??赏ㄟ^(guò)包裝器的方式來(lái)實(shí)現(xiàn),網(wǎng)上這方面的信息很少,個(gè)人理解,就是額外做一個(gè)中間層,將labview和dll進(jìn)行連接。更進(jìn)一步,就用其他語(yǔ)言如c++,編寫好相關(guān)的函數(shù)指針,完全實(shí)現(xiàn)既定的功能,之后再打包成中間的dll,在labview中進(jìn)行調(diào)用。

labview本身,是支持回調(diào)函數(shù)的,只不過(guò),這種機(jī)制是在內(nèi)部進(jìn)行實(shí)現(xiàn)(也許還支持其他的交互方式,本人沒(méi)有測(cè)試出來(lái))??梢岳么斯δ埽帉懸恍┊惒降某绦?,解決一些程序執(zhí)行時(shí)間較長(zhǎng)的問(wèn)題。

1)搜索找到“事件回調(diào)注冊(cè)”,這兩個(gè)是同樣的東西,在不同的文件路徑下面,選擇一個(gè)即可。

wKgaomTnFqOAMiF2AABhurO2fqQ366.jpg

2)拖放到程序框圖內(nèi),這個(gè)函數(shù)包含了事件、VI引用還有用戶參數(shù)。

wKgZomTnFqOAfYF8AAEGbSpmYyI094.jpg

3)這里寫一個(gè)簡(jiǎn)單的測(cè)試函數(shù),a+b=sum。其中a傳入值,b和sum傳入引用。

void Add(int a, int& b, int& sum) {

sum = a + b;

}

這幾個(gè)參數(shù),作為函數(shù)的輸入,連接到用戶參數(shù)中上面。

wKgaomTnFqOAEJNrAACAEelHcmM625.jpg

4)選擇這個(gè)回調(diào)函數(shù)的觸發(fā)方式,這里使用A的值改變。將A的引用連接到“事件”接線端,選擇相應(yīng)的事件。

wKgaomTnFqOAUrFcAAGpI-YcXmg316.jpg

5)在VI引用上,右鍵選擇“創(chuàng)建回調(diào)VI”,可以自動(dòng)生成一個(gè)用于執(zhí)行的VI函數(shù)。

wKgZomTnFqSATtAMAAEgo5mnho8496.jpgwKgaomTnFqSAQXvMAAGGlQfWglo837.jpg

這個(gè)生成的VI與自己編寫的VI靜態(tài)調(diào)用有所區(qū)別,界面顯示多了個(gè)*,右鍵查看是選擇了“嚴(yán)格類型VI的引用”。

wKgaomTnFqOAQUmBAAH37j7997k875.jpg

6)編程完成相關(guān)函數(shù)功能,保存VI。

wKgZomTnFqSAMjnRAAFT_7Srmcs758.jpg

7)編寫簡(jiǎn)單的循環(huán)和延時(shí),保證程序一直是執(zhí)行狀態(tài)。

wKgZomTnFqSAESfKAAFAftMgRv4541.jpg

8)程序測(cè)試。輸入A=1,B=1,運(yùn)行軟件。軟件運(yùn)行時(shí),程序沒(méi)有執(zhí)行。當(dāng)用于觸發(fā)的A達(dá)到“值改變”的條件時(shí),程序運(yùn)行,sum得到數(shù)據(jù)為2。

wKgaomTnFqSAe_LiAAD_i-z5EHM316.jpg

9) 后續(xù)改變A的數(shù)值,發(fā)現(xiàn)整個(gè)sum沒(méi)有發(fā)生變化,A的數(shù)據(jù)是以值的類型傳入的,后面再改變數(shù)據(jù),也無(wú)法改變最初傳入的數(shù)據(jù)值。

wKgaomTnFqeAFcBpAAB4W6jkJHU658.jpg

10)修改B的數(shù)據(jù),再修改A觸發(fā)程序,可以以看到程序運(yùn)行。說(shuō)明只需要注冊(cè)一次,程序可以觸發(fā)多次。

wKgZomTmHWuAIWsAAAFPqHy_OUg638.png

11)在常規(guī)用事件結(jié)構(gòu)處理的事件,在“事件檢測(cè)窗口”中,都是有記錄的。但是利用事件回調(diào)是沒(méi)有記錄的,說(shuō)明這個(gè)事件回調(diào)和事件結(jié)構(gòu)沒(méi)有直接關(guān)系。

wKgZomTnFqSAJj0-AAJGzp9lQ2w136.jpg
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • LabVIEW
    +關(guān)注

    關(guān)注

    1958

    文章

    3651

    瀏覽量

    321462
  • 調(diào)試
    +關(guān)注

    關(guān)注

    7

    文章

    564

    瀏覽量

    33837
  • 程序
    +關(guān)注

    關(guān)注

    115

    文章

    3747

    瀏覽量

    80669
  • 回調(diào)函數(shù)
    +關(guān)注

    關(guān)注

    0

    文章

    87

    瀏覽量

    11521
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    GUI調(diào)函數(shù)

    GUI調(diào)函數(shù)在哪里編寫?
    發(fā)表于 03-21 12:37

    調(diào)函數(shù)

    C++內(nèi)編寫的DLL中有很多事件都是通過(guò)調(diào)函數(shù)來(lái)反饋,LABVIEW如何可以調(diào)用呢?
    發(fā)表于 11-06 15:36

    labview怎么處理dll調(diào)函數(shù)輸出值

    ); PrintLastFlashError(false);} }請(qǐng)問(wèn)調(diào)函數(shù)一的參數(shù)值progressInPercent, remainingTimeInS,
    發(fā)表于 02-19 10:21

    關(guān)于labview調(diào)用dll的事件并回調(diào)問(wèn)題

    我用c#寫了一個(gè)dll,其中方法add中有一個(gè)事件MyEvent(圖1),我在labview調(diào)用了這個(gè)方法并使用了事件調(diào)(圖2),
    發(fā)表于 11-22 10:55

    詳解java 調(diào)機(jī)制

    代碼示例 接下來(lái)看一下調(diào)的代碼示例,代碼模擬的是這樣一種場(chǎng)景:老師問(wèn)學(xué)生問(wèn)題,學(xué)生思考完畢回答老師。 首先定義一個(gè)調(diào)接口,只有一個(gè)方法tellAnswer(int answer),
    發(fā)表于 09-28 13:14 ?0次下載

    LabWindows/CVI 程序 調(diào)函數(shù)設(shè)計(jì)

    調(diào)函數(shù)是系統(tǒng)框架設(shè)計(jì)中非常重要的一種手段,所謂調(diào)函數(shù)(callback )是指一個(gè)通過(guò)函數(shù)指針調(diào)用的函數(shù)。
    發(fā)表于 05-03 16:54 ?1.1w次閱讀
    LabWindows/CVI 程序 <b class='flag-5'>回</b><b class='flag-5'>調(diào)</b>函數(shù)設(shè)計(jì)

    調(diào)函數(shù)的詳細(xì)資料說(shuō)明

    異步事件的處理,首先將異步事件發(fā)生時(shí)需要執(zhí)行的代碼編寫成一個(gè)函數(shù),并將該函數(shù)注冊(cè)成為調(diào)函數(shù),這樣當(dāng)該異步事件發(fā)生時(shí),系統(tǒng)會(huì)自動(dòng)調(diào)用事先注冊(cè)好的調(diào)函數(shù)。
    發(fā)表于 02-28 08:00 ?6次下載
    <b class='flag-5'>回</b><b class='flag-5'>調(diào)</b>函數(shù)的詳細(xì)資料說(shuō)明

    5個(gè)使用帶有中斷的調(diào)的技巧

    調(diào)是對(duì)更高級(jí)別軟件傳遞到函數(shù)的可執(zhí)行代碼的引用。這些調(diào)能夠極大地提高嵌入式軟件的可移植性和重用性,但是根據(jù)它們的定義,它們需要使用函數(shù)指針,如果不仔細(xì)使用,可能會(huì)非常危險(xiǎn)。以下是在
    的頭像 發(fā)表于 08-09 09:18 ?5009次閱讀
    5個(gè)使用帶有中斷的<b class='flag-5'>回</b><b class='flag-5'>調(diào)</b>的技巧

    C語(yǔ)言函數(shù)的調(diào)函數(shù)

    來(lái)源:嵌入式客棧 1 什么是調(diào)函數(shù)?首先什么是調(diào)呢? 我的理解是:把一段可執(zhí)行的代碼像參數(shù)傳遞那樣傳給其他代碼,而這段代碼會(huì)在某個(gè)時(shí)刻被調(diào)用執(zhí)行,這就叫做回
    的頭像 發(fā)表于 09-11 09:57 ?4069次閱讀

    嵌入式開發(fā)軟件調(diào)函數(shù)的使用

    在嵌入式開發(fā)軟件調(diào)函數(shù)是經(jīng)常接觸的一種軟件設(shè)計(jì)方法,像我們的事件處理機(jī)制基本上都會(huì)使用到調(diào)函數(shù)。
    的頭像 發(fā)表于 04-29 08:57 ?2187次閱讀

    根據(jù)調(diào)機(jī)制注冊(cè)事件并處理調(diào)VI

    通過(guò)事件調(diào)注冊(cè)函數(shù)(Register Event Callback)注冊(cè)一個(gè)調(diào)VI,在事件發(fā)生時(shí)會(huì)運(yùn)行該回調(diào)VI,通常用于注冊(cè)和處理.N
    的頭像 發(fā)表于 11-24 09:15 ?2122次閱讀

    函數(shù)指針和調(diào)函數(shù)的使用方法

    了解開發(fā)語(yǔ)言的朋友應(yīng)該都會(huì)對(duì)調(diào)函數(shù)有所了解,在很多的程序開發(fā)語(yǔ)言中都能看到調(diào)的身影。很多場(chǎng)景下,當(dāng)某個(gè)條件成立以后我們希望代碼執(zhí)行某些指定的部分,這個(gè)時(shí)候可以考慮使用回
    的頭像 發(fā)表于 04-10 15:08 ?1023次閱讀

    C語(yǔ)言|調(diào)函數(shù)的不同用法

    調(diào)函數(shù)是個(gè)高級(jí)操作技巧,也是日常項(xiàng)目中常常使用到的技能。之所以說(shuō)調(diào)函數(shù)是個(gè)高級(jí)操作技巧,是因?yàn)樗尞惒讲僮鞲臃奖?,眾所周知程序?zhí)行分為同步操作和異步操作,同步操作故名思意就是按代
    發(fā)表于 07-10 10:34 ?1197次閱讀

    ??嵌入式調(diào)函數(shù)的實(shí)現(xiàn)方法

    調(diào)函數(shù)的命名規(guī)范沒(méi)有固定的標(biāo)準(zhǔn),但是根據(jù)通用慣例和編碼規(guī)范,調(diào)函數(shù)的命名應(yīng)該能夠反映函數(shù)的作用和功能,讓其他開發(fā)者能夠快速理解并使用。
    發(fā)表于 03-04 14:49 ?589次閱讀

    調(diào)函數(shù)(callback)是什么?調(diào)函數(shù)的實(shí)現(xiàn)方法

    調(diào)函數(shù)是一種特殊的函數(shù),它作為參數(shù)傳遞給另一個(gè)函數(shù),并在被調(diào)用函數(shù)執(zhí)行完畢后被調(diào)用。調(diào)函數(shù)通常用于事件處理、異步編程和處理各種操作系統(tǒng)和框架的API。
    發(fā)表于 03-12 11:46 ?2473次閱讀