中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么在python中實現capl語言里的回調函數

發布時間:2022-08-09 09:22:30 來源:億速云 閱讀:208 作者:iii 欄目:開發技術

這篇“怎么在python中實現capl語言里的回調函數”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“怎么在python中實現capl語言里的回調函數”文章吧。

CAPL:回調函數

CAPL是一種程序語言,其中程序塊的執行由事件控制。 這些程序塊被稱為事件程序。在事件程序中定義的程序代碼在事件發生時執行。換句話說,事件程序就是事件函數,當事件函數關聯的事件被觸發時,會自動執行此事件函數函數體。事件函數也稱為回調函數

事件函數的標志就是關鍵字on,比如:

  • on key 表示當鍵盤按下小寫字母a時觸發此事件函數執行

  • on message 表示當接收到消息時觸發此事件函數執行

  • on start 表示當canoe軟件運行時觸發此事件函數執行

  • on sysvar 表示系統變量值發生改變時觸發此事件函數執行

還有很多此類函數,你可以通過在capl文件的左側的導航欄里右擊插入不同類型的事件函數

怎么在python中實現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中實現capl語言里的回調函數

Python:回調函數

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語言里的回調函數”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

奇台县| 佛冈县| 大方县| 平塘县| 鄂托克前旗| 漯河市| 密山市| 灵台县| 雅江县| 长汀县| 鄯善县| 河源市| 故城县| 绥阳县| 晋州市| 汉源县| 迁西县| 抚州市| 宣汉县| 左云县| 梁河县| 宁都县| 济南市| 长寿区| 类乌齐县| 临夏市| 四平市| 宝山区| 灌南县| 台山市| 阿拉善右旗| 兰溪市| 馆陶县| 深州市| 犍为县| 平果县| 浦江县| 盘锦市| 洞头县| 武川县| 县级市|