labviEW一个生产者,多个消费者问题

2019-07-17 15:34发布

大家好,我的程序的出发点是希望实现一个生产者,十六个消费者模块的形式。
即生产者循环中的事件结构有十六个处理分支,对应每一个分支,它产生一个“开始”元素入队列,相应的消费者模块中元素出队列,开始数据采集,而且数据采集部分是比较耗时间的,数据采集部分有相应的跳出循环机制。
问题是我现在一共有16个消费者模块,我需要用16个循环!这样太不合理了,有没有什么更好的实现方式,请大伙给点建议。谢谢大家!
demo.png
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
19条回答
zhangguangrong
1楼-- · 2019-07-17 17:33
能否说说你为什么要用16个消费者 不能放在一个while里吗
jiuri1989
2楼-- · 2019-07-17 18:55
zhangguangrong 发表于 2012-4-5 16:49
能否说说你为什么要用16个消费者 不能放在一个while里吗

是这样子的,这16个消费者,分别负责不同部分的信号采集。我希望它们能并行,或者按先后顺序执行也行,但不能因为某个部分处于等待状态而担误其它部分数据采集。有点觉得用队列不合适,怪怪的。但又不知道怪在哪。
zhangguangrong
3楼-- · 2019-07-17 23:20
 精彩回答 2  元偷偷看……
小米好用
4楼-- · 2019-07-18 04:25
其实就一个消费者, 通过case来区别呢?
jiuri1989
5楼-- · 2019-07-18 07:52
小米好用 发表于 2012-4-5 17:02
其实就一个消费者, 通过case来区别呢?

我的第一感觉是可以更好的来处理这种情况。所以我又做了一些尝试,请大家评价。谢谢

我的修改如下:
1)队列的元素为簇,这里我以两个消费者为例:对于簇包含的布尔数组,假如值为(1,0),则对应在消费者循环中,第一个消费者会被特殊处理。
2)限定队列的大小为1
3)生产者循环中,元素入队列函数改成“有损耗元素入队列”,即队列已满的情况下队列会删除最前端的元素,这样做的目的是避免当生产者部分短时间内产生多次元素入队列事件,而由于消费者循环部分是比较耗时的,消费者循环好不容易执行完本次循环,准备下一次循环时,却不确定响应的是哪一次生产者产生的事件呢,两者变得不同步了。
4)在消费者模块中,每一次For循环执行完后,为了维持消费者循环的运行,加入一个判断语句,获取当前队列的状态,若队列为空,则元素入队列,值为(0,0),即不对任何一个消费者做特殊处理(可以理解特殊处理为硬件配置等等情况),但是保证消费者循环的运行。
附件是截图和源程序,请大家查看。谢谢

self_charge.jpg
self_charge.vi (20.32 KB, 下载次数: 84)
黑木耳
6楼-- · 2019-07-18 08:31
很有想法的!
我觉得可以这样子,把16数据采集做成相互独立的16个VI,在主VI里通过动态调用把16个DAQ VI运行起来。 主VI里只要用标准的生产者消费者即可。 在主VI用户界面操作开始每一个DAQ时往相应的DAQ VI发开始采集的消息。  每个DAQ VI也可以用生产者消费者形式。 
其实上面这种方法也相当于放16个消费者循环了,不过程序结构看上去会好些。 主VI如下图所示. 只是示意图.  主VI只负责往DAQ VI发消息,他不做实际的数据采集, 因此永远是马上返回的.
temp1.jpg

temp3.jpg
DAQ VI如下, 每个都类似. 用Queue的名字来区分, 比如DAQ One, DAQ Two,。。。 主VI则是通过这个名字来访问这些不同VI的QUeue, 并给他们发DAQ  Start 的消息。  DAQVI收到 DAQ Start之后则可以做数据采集的事情,所有DAQ VI之间互不影响。
temp2.jpg

一周热门 更多>