本VI是1个演示事件结构控制多个并行循环执行的示例,循环间通信是通过使用通知器实现循环间的通知和应答机制。示例中的两个循环分别是当前时间刷新循环和随机数刷新循环。使用者可以将这两个循环替换成自己的循环程序,如串口数据的循环发送和循环接收。使用者还可以增加更多的循环,只需要创建相应的通知器和应答器并增加相应的事件处理分支即可。" C" ]6 `, Z$ V1 c, s
' R:
M1 W7 _) j 关键概念: 1、通知器应答器; 2、事件响应循环、任务循环(由任务执行等待循环和任务执行循环构成,任务执行循环是任务执行等待循环的子循环); 3、等待通知或应答以及等待超时设置(关键); 4任务执行循环状态指示(关键)。' ?. X* T* x* o M
4 ?% c% N& I- |5 l5 v+ T3 P ~8 k
- m6 d' D* M3 P 原理简述: 第一步,程序初始化化,将所有输入输出控件以及程序状态变量初始化为合理的状态。+ Y q
第二步,创建程序中事件响应循环与其他任务循环之间的通知器和应答器。
9 d& Q4 u1 a) z 第三步,实现事件响应循环与其他任务循环的并行运行。在事件响应循环中,当检测到用户控件事件后,通过通知器查询任务执行循环状态指示后决定是否向相应的任务循环发送通知指令,若发送就要等待接收到通知指令的任务循环返回的应答指令(正常情况下,应答很快,但为了保险起见,我在事件循环中设置的等待响应超时为1秒,从而即给任务响应留足够的时间裕量,又避免事件响应锁死)。任务循环是由任务执行等待循环和任务执行循环组成的,任务执行循环是任务执行等待循环的子循环。当任务执行等待循环没有接收到任务执行循环开始指令时,任务执行等待循环一直处于等待状态(即不往下走),当任务执行等待循环一旦接收到任务执行循环开始指令时,任务执行等待循环退出等待状态(即往下走)立即应答后置响应的任务执行循环状态指示为真并进入任务执行循环。在任务执行循环中,每循环执行一次任务帧后,就查询是否有任务执行循环停止指令(查询超时设为1ms),如果没有查询到任务执行循环停止命令(即查询超时),就继续任务执行循环,如果查询到任务执行循环停止指令,就退出任务执行循环并置任务执行循环状态指示为假,然后回到上一级的任务执行等待循环,如此周而复始。 第四步,实现程序退出,关键是如何实现事件响应循环和多个任务循环的安全退出,避免出现任何死循环。实现方法如下。首先,事件响应循环响应程序退出事件,先查询任务循环状态指示,如果有任何任务循环处在循环执行状态(指的是任务循环运行到了任务执行循环中),就发送任务执行循环停止指令,使任务执行循环退出并回到任务执行等待循环。如果当所有的任务执行循环等处在任务执行等待循环状态下,就可以在事件响应循环的程序退出分支中安全地删除所有的通知器和应答器。这时,所有的任务循环(必须处在任务执行等待状态)会因为找不到通知器而报错,正是巧妙利用这个报错实现任务循环的终止。这样,再加上事件响应循环自己能退出,就完成了整个程序的退出。 温馨提示: 通知器和应答器采用的指令根据需要可定义成任何数据类型,建议用簇的方式封装任何你想要的信息,说白了通信就是为了传各种信息,呵呵