最近測試了labview調(diào)用dll中的回調(diào)函數(shù)相關(guān)功能,遇到了一些問題,現(xiàn)在做一下整理和總結(jié),相關(guān)的內(nèi)容比較多,分多篇來寫。
在LabVIEW中,新手經(jīng)常將所有的程序放在事件結(jié)構(gòu)中來執(zhí)行,有時還不取消前面板鎖定,一個事件觸發(fā)沒有執(zhí)行完成時,又去執(zhí)行另外一個事件,導(dǎo)致界面鎖死,必須從任務(wù)管理器里面關(guān)閉程序才行。

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

先簡單介紹一下回調(diào)函數(shù),是一種在編程中常見的概念,它通常用于在特定事件發(fā)生時執(zhí)行預(yù)定義的操作。回調(diào)函數(shù)可以作為參數(shù)傳遞給其他函數(shù),以便在需要時被調(diào)用,從而實現(xiàn)定制的事件處理和邏輯分離。詳細的概念網(wǎng)上很多,可以感興趣可以查一下。
在labview中,無法實現(xiàn)將函數(shù)的地址指針傳遞給dll的,實際測試過VI引用是不可以的。可通過包裝器的方式來實現(xiàn),網(wǎng)上這方面的信息很少,個人理解,就是額外做一個中間層,將labview和dll進行連接。更進一步,就用其他語言如c++,編寫好相關(guān)的函數(shù)指針,完全實現(xiàn)既定的功能,之后再打包成中間的dll,在labview中進行調(diào)用。
labview本身,是支持回調(diào)函數(shù)的,只不過,這種機制是在內(nèi)部進行實現(xiàn)(也許還支持其他的交互方式,本人沒有測試出來)。可以利用此功能,編寫一些異步的程序,解決一些程序執(zhí)行時間較長的問題。
1)搜索找到“事件回調(diào)注冊”,這兩個是同樣的東西,在不同的文件路徑下面,選擇一個即可。

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

3)這里寫一個簡單的測試函數(shù),a+b=sum。其中a傳入值,b和sum傳入引用。
void Add(int a, int& b, int& sum) {
sum = a + b;
}
這幾個參數(shù),作為函數(shù)的輸入,連接到用戶參數(shù)中上面。

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

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


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

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

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

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

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

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

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

-
LabVIEW
+關(guān)注
關(guān)注
1995文章
3670瀏覽量
333177 -
調(diào)試
+關(guān)注
關(guān)注
7文章
607瀏覽量
34518 -
程序
+關(guān)注
關(guān)注
117文章
3824瀏覽量
82418 -
回調(diào)函數(shù)
+關(guān)注
關(guān)注
0文章
88瀏覽量
11825
發(fā)布評論請先 登錄
回調(diào)函數(shù)
labview怎么處理dll中的回調(diào)函數(shù)輸出值
關(guān)于labview中調(diào)用dll中的事件并回調(diào)問題
詳解java 回調(diào)機制
LabWindows/CVI 程序 回調(diào)函數(shù)設(shè)計

回調(diào)函數(shù)的詳細資料說明

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

評論