测量仪表
了解了Channel Wire后,我们来看看关于Channel Wire的一些应用和注意点。
1、Channel Messenger Handler
操作者通过用户界面上不同的按钮,把需要不同的消息发送给消息处理线程;消息处理线程按照接收到消息的先后顺序处理这些消息。这也是一个经典的设计模式,它的实现路径就是messenger类型的channel wire。
注意:上面三个循环是并行的三个线程。channel wire不定义代码执行顺序。 这是一个非常实用的设计模式,可以把需要处理的子任务做成subVI,在Message Handling Loop里调用。 2、正确使用stream channel,避免死锁 这个示例的名称是“channel-tag”,演示的功能是A、B、C三个工作站的温度一旦超过Threshold Setting设置的值就显示“Too hot!”予以警示。
下图是初始代码。这个代码仔细看看是存在两个bug的。第一,有两个写通道操作(下图标记1和2的两处),但是执行顺序不确定。第二,右边三个线程可能以threshold的值为0运行,因为读通道操作可能未读到数据(右边三个线程之一或者全部在通道写入完成前开始运行了)。
针对上述bug,下图代码做了改进。 第一,1初特意加了一根连接线,明确两个写通道操作的执行顺序。第二,通过移位寄存器(2和3)让读通道操作第一次执行时无限等待,直到读到数据了再往下执行,以确保threshold至少被写入了一次。
3、准确理解含有channel wire的程序执行顺序 Parallel Channels Problem,这个示例,演示了多个channel wire并用的时候,可能出现的死锁问题。程序界面上有三个Stop按钮,有可能可以正常退出这个程序,也极有可能无法正常退出。常见的结果应该是,A、B、C三部分都停止更新数据了,但是主程序无法退出。
出现这个问题的原因在于通道的Read操作,默认是无限等待的——没有读到数据就一直等待。Producer A停止后,ConsumerA可能无数据可读,就会一直等下去,从而主程序就无法正常退出。 Producer B和Consumer B通过给Read设置20ms超时时间来解决这个问题。 Producer C和Consumer C通过Write和Read操作的last element属性来解决这个问题。
以上几个示例,都是LabVIEW自带的。LabVIEW里还有很多有关channel的示例,建议大家去看看,对开阔思路、加深理解、熟练运用channel wire都大有裨益。
编辑:黄飞
全部0条评论
快来发表一下你的评论吧 !