LabView中使用事件结构可能会令人困惑,尤其是在将它们与大部分同步工作流程混合时。我的问题是,当事件结构存在于序列的一帧中时,我如何强制它忽略在工作流位于序列的另一帧中时触发的事件(例如,将鼠标悬停在特定按钮上)?
目前,事件结构仅处理序列中正确帧处的事件,但如果工作流在上一帧中触发了事件,它也会处理这些事件,我希望它忽略事件结构所在的帧中未触发的任何事件。
http://puu.sh/hwnoO/acdd4c011d.png
这是我工作流程的一部分。如果在左侧部分执行时触发鼠标按下,我希望事件结构在序列到达它时忽略这些事件。
不要将事件结构放在主程序序列中,而是将其放在单独的循环中,并让它通过队列将每个事件的详细信息传递给主序列。然后,您可以通过在适当的点刷新队列来放弃不需要的事件的详细信息。
或者,您可以使用布尔控件来确定事件循环是将事件详细信息发送到队列还是丢弃它们,并使用主序列中的局部变量切换布尔值。
您可以动态注册事件。注册是事件结构开始对事件进行排队的时间点,在您的情况下,当事件结构处于运行模式的VI时(意味着它正在执行或其调用方之一正在执行)时,就会发生这种情况。可以更改它,以便使用"注册事件"节点进行注册,然后仅从该点开始获取事件。取消注册后,您将停止获取事件。
杰克·杜纳威(Jack Dunaway)有一个非常好的演讲,详细介绍了这里的事件。
您可以在此处找到它的代码。
在 LabVIEW 2013 及 更高 版本 中 有 其他 用于 控制 事件 队列 的 选项, 但 我 不会 在此 介绍 这些 选项。
http://puu.sh/hwsBE/fe50dee671.png
我不知道如何刷新内置事件类型(如鼠标按下)的事件队列,但我设法通过创建对VI的静态引用并在上一个序列中将光标设置为繁忙,禁用单击来解决这个问题。然后,当到达事件结构的序列时,我将光标从 busy 中取消设置,这将重新启用单击。