<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
CAPL是一種程式語言,其中程式塊的執行由事件控制。 這些程式塊被稱為事件程式。在事件程式中定義的程式程式碼在事件發生時執行。換句話說,事件程式就是事件函數,當事件函數關聯的事件被觸發時,會自動執行此事件函數函數體。事件函數也稱為回撥函數
事件函數的標誌就是關鍵字on,比如:
還有很多此類函數,你可以通過在capl檔案的左側的導航欄裡右擊插入不同型別的事件函數
就是在程式執行期間,可以隨時監控某種事件的發生,執行對應的操作。比如你想在can匯流排上監測收到can訊息0x11時獲取can訊息資料,就可以使用on message 0x11
on message 0x11 { byte msg_bytes[8]; int i; for(i=0;i<8;i++) { msg_bytes[i] = this.byte(i); } }
可能是雖然主程式裡的程式碼在從上往下按順序在執行,但是在這期間只要觸發事件函數的條件發生改變,就會“回頭”執行事件函數。當然,主程式和事件函數是非同步執行
這裡有一些注意事項:
Simulation Setup模擬介面插入的Network Node網路節點,載入的capl指令碼是沒有主程式MainTest的
Test Modules和Test Units載入的capl指令碼,是不允許使用system型別的事件函數的
python執行回撥函數,是在呼叫某個函數時,把回撥函數指標當作引數傳入要呼叫的函數中,在函數內部呼叫回撥函數
def OnEvent_1(): print("callback up") def TriggerFunc(fn): fn() if __name__ == "__main__": TriggerFunc(OnEvent_1)
在執行TriggerFunc()時,通過傳入OnEvent_1()函數指標作為引數,在TriggerFunc()函數體內部呼叫OnEvent_1()實現回撥
所以,OnEvent_1()函數是回撥函數,執行TriggerFunc()函數就可以看作觸發回撥函數的條件
這裡有兩個注意點:
函數指標是指向函數的指標變數,用函數名錶示,不能有括號“()”
呼叫函數時函數名必須有括號“()”才能呼叫
capl中的事件函數,有幾個特點:
所以在python中想實現這些特點,可以這樣:
import time import threading def OnEvent_1(): # 事件函數1 print("OnEvent_1 up") def OnEvent_2(): # 事件函數2 print("OnEvent_2 up") class RegistEvents(): # 全域性變數,存入事件函數指標和對應的觸發條件 registEvents = {} # 存入key:value,key是事件函數指標,value是觸發此事件函數的條件 def TriggerFunc(): # 非同步函數,用來監測觸發條件是否觸發,如果觸發就執行對應的函數 currentRegistEvents = {} # 當前的事件和對應條件存入這裡 for event in RegistEvents.registEvents.keys(): currentRegistEvents[event] = RegistEvents.registEvents[event] while True: time.sleep(0.01) for event in RegistEvents.registEvents.keys(): if currentRegistEvents[event] != RegistEvents.registEvents[event]: event() currentRegistEvents[event] = RegistEvents.registEvents[event] if __name__ == "__main__": RegistEvents.registEvents[OnEvent_1] = 0 # 對事件函數OnEvent_1和它的條件進行委託 RegistEvents.registEvents[OnEvent_2] = 0 # 對事件函數OnEvent_2和它的條件進行委託 t = threading.Thread(target = TriggerFunc) # 對監測觸發條件的函數建立執行緒,非同步執行 t.start() time.sleep(1) RegistEvents.registEvents[OnEvent_1] = 1 # 觸發條件本來是0,現在設定為1 RegistEvents.registEvents[OnEvent_2] = 1 time.sleep(1) RegistEvents.registEvents[OnEvent_1] = 2 # 觸發條件本來是1,現在設定為2 RegistEvents.registEvents[OnEvent_2] = 2
由於python中並沒有像capl中那樣對不同型別觸發的事件函數進行定義(on key/on message等),所以這裡我們可以借鑑c sharp語言中的委託,定義委託,然後註冊事件,最後執行
這裡用一個字典來註冊(存入)事件和對應的觸發條件,key是事件函數指標,value是觸發條件(其實是事件函數指標關聯的一個值)
為什麼不是key是觸發條件,value是函數指標呢?
因為事件函數的觸發條件需要改變,而字典中的key寫入後是無法改變的,但是value是可以改變的,所以value作為觸發條件會更好
到此這篇關於如何在python中實現capl語言裡的回撥函數的文章就介紹到這了,更多相關python回撥函數內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45