CAPL:回调函数

CAPL是一种程序语言,其中程序块的执行由事件控制。 这些程序块被称为事件程序。在事件程序中定义的程序代码在事件发生时执行。换句话说,事件程序就是事件函数,当事件函数关联的事件被触发时,会自动执行此事件函数函数体。事件函数也称为回调函数

事件函数的标志就是关键字on,比如:

  • on key 表示当键盘按下小写字母a时触发此事件函数执行
  • on message 表示当接收到消息时触发此事件函数执行
  • on start 表示当canoe软件运行时触发此事件函数执行
  • on sysvar 表示系统变量值发生改变时触发此事件函数执行

还有很多此类函数,你可以通过在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:回调函数

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 threadingdef OnEvent_1(): # 事件函数1print("OnEvent_1 up")def OnEvent_2(): # 事件函数2print("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,现在设置为1RegistEvents.registEvents[OnEvent_2] = 1time.sleep(1)RegistEvents.registEvents[OnEvent_1] = 2 # 触发条件本来是1,现在设置为2RegistEvents.registEvents[OnEvent_2] = 2

由于python中并没有像capl中那样对不同类型触发的事件函数进行定义(on key/on message等),所以这里我们可以借鉴c sharp语言中的委托,定义委托,然后注册事件,最后执行

这里用一个字典来注册(存入)事件和对应的触发条件,key是事件函数指针,value是触发条件(其实是事件函数指针关联的一个值)

为什么不是key是触发条件,value是函数指针呢?

因为事件函数的触发条件需要改变,而字典中的key写入后是无法改变的,但是value是可以改变的,所以value作为触发条件会更好


如何在python中实现capl语言里的回调函数相关推荐

  1. python如何用c语言表示_如何在python中调用C语言代码

    原博文 2019-04-03 14:19 − 1.使用C扩展CPython还为开发者实现了一个有趣的特性,使用Python可以轻松调用C代码 开发者有三种方法可以在自己的Python代码中来调用C编写 ...

  2. 如何在python中使用表情(emoji)符号?

    表情符号是世界上增长最快的语言,有超过3000种表情符号.那么,为什么不开始在我们的python程序中使用表情符号.在本文中,您将学习如何在python中使用表情符号. 为了在python中使用表情符 ...

  3. python if语句多个条件-关于函数:如何在python中为一个if语句提供多个条件

    本问题已经有最佳答案,请猛点这里访问. 所以我在用python 3.1.5编写一些代码,这些代码需要有多个条件才能发生某些事情.例子: 1 2 3 4 5def example(arg1, arg2, ...

  4. 小结两种在Python中导入C语言扩展库的方法

    小结两种在Python中导入C语言扩展库的方法 分类: Pythoner2009-08-18 20:44 2563人阅读 评论(1) 收藏 举报 python扩展c语言importstring 一种是 ...

  5. 【机器学习基础】如何在Python中处理不平衡数据

    特征锦囊:如何在Python中处理不平衡数据 ???? Index 1.到底什么是不平衡数据 2.处理不平衡数据的理论方法 3.Python里有什么包可以处理不平衡样本 4.Python中具体如何处理 ...

  6. python r语言 结合 部署_(转)python中调用R语言通过rpy2 进行交互安装配置详解...

    python中调用R语言通过rpy2 进行详解 1.R语言的安装: 大家进行R语言的安装,在安装好R后,需要配置环境变量R才能进行使用. 对此电脑右键->选择高级设置->环境变量-> ...

  7. eval在python中是什么意思_如何在Python中使用eval ?

    Python中的 eval是什么? 在Python中,我们有许多内置方法,这些方法对于使Python成为所有人的便捷语言至关重要,而eval是其中一种.eval函数的语法如下: eval(expres ...

  8. linux中python如何调用matlab的数据_特征锦囊:如何在Python中处理不平衡数据

    今日锦囊 特征锦囊:如何在Python中处理不平衡数据 ? Index 1.到底什么是不平衡数据 2.处理不平衡数据的理论方法 3.Python里有什么包可以处理不平衡样本 4.Python中具体如何 ...

  9. python字符串筛选输出_如何在Python中过滤字符串列表

    Python使用列表数据类型在顺序索引中存储多个数据.它的工作方式类似于其他编程语言的数字数组.filter()方法是Python的一种非常有用的方法.可以使用filter()方法从Python中的任 ...

  10. python boolean_如何在Python中使用boolean’和’

    本问题已经有最佳答案,请猛点这里访问. 在c中,我们可以使用&&(布尔和),如下所示: int i = 5; int ii = 10; if(i == 5 && ii ...

最新文章

  1. 到「黄埔学院」去:打造AI首席架构师,第二期限量招募!
  2. js调用数科阅读器_阅读大型 JavaScript 源码时有什么好用的工具?
  3. UOJ46. 【清华集训2014】玄学
  4. 帝国cms会员充值交易推广分润系统的界面实现与开发记录
  5. CSP认证201709-1 打酱油[C++题解]:贪心
  6. ETL AUTOMATION介绍
  7. 全面剖析Ajax的XMLHttpRequest对象(学习Ajax必须知道的东西)
  8. 报表传值,主表隐藏id样式设置
  9. python学习笔记15-执行环境
  10. XCode出现Could not locate device support files的解决办法
  11. 常见的 web server
  12. HDFS存储大量小文件的问题及解决方案
  13. 业务模式制胜,BLM战略规划七步法
  14. C++:wchar_t 和C++新增类型:char16_t char32_t
  15. 为什么浏览器网页每次打开都是搜狗?
  16. Git - 强制覆盖本地代码[与远程仓库保持一致]
  17. c语言程序电子琴21个音符,儿童电子琴入门《认识附点音符,二分附点音符》
  18. 如何对Win10电脑文件夹选项进行设置?
  19. 花生日记 php,花生日记小白
  20. 超详细的canal使用总结

热门文章

  1. 小技巧:Win7屏保变梦幻桌面
  2. 考虑SOC蓄电池 双向DC/DC 充放电控制 matlab仿真模型 buck boost
  3. Tomcat8正确配置环境变量详细方法
  4. 最大流问题(超详细!!!)
  5. java list对象转json_java中List对象转换为JSON对象
  6. java 6个逆向工程软件
  7. 计算机逆向工程专业,计算机软件反向工程的合法性研究
  8. QImage与QPixmap区别
  9. 3DMM之EOS 原理解析
  10. “微积分7天搞定”学习记录