2019-07-17 15:34发布
zhangguangrong 发表于 2012-4-5 16:49 能否说说你为什么要用16个消费者 不能放在一个while里吗
小米好用 发表于 2012-4-5 17:02 其实就一个消费者, 通过case来区别呢?
最多设置5个标签!
是这样子的,这16个消费者,分别负责不同部分的信号采集。我希望它们能并行,或者按先后顺序执行也行,但不能因为某个部分处于等待状态而担误其它部分数据采集。有点觉得用队列不合适,怪怪的。但又不知道怪在哪。
我的第一感觉是可以更好的来处理这种情况。所以我又做了一些尝试,请大家评价。谢谢
我的修改如下:
1)队列的元素为簇,这里我以两个消费者为例:对于簇包含的布尔数组,假如值为(1,0),则对应在消费者循环中,第一个消费者会被特殊处理。
2)限定队列的大小为1
3)生产者循环中,元素入队列函数改成“有损耗元素入队列”,即队列已满的情况下队列会删除最前端的元素,这样做的目的是避免当生产者部分短时间内产生多次元素入队列事件,而由于消费者循环部分是比较耗时的,消费者循环好不容易执行完本次循环,准备下一次循环时,却不确定响应的是哪一次生产者产生的事件呢,两者变得不同步了。
4)在消费者模块中,每一次For循环执行完后,为了维持消费者循环的运行,加入一个判断语句,获取当前队列的状态,若队列为空,则元素入队列,值为(0,0),即不对任何一个消费者做特殊处理(可以理解特殊处理为硬件配置等等情况),但是保证消费者循环的运行。
附件是截图和源程序,请大家查看。谢谢
我觉得可以这样子,把16数据采集做成相互独立的16个VI,在主VI里通过动态调用把16个DAQ VI运行起来。 主VI里只要用标准的生产者消费者即可。 在主VI用户界面操作开始每一个DAQ时往相应的DAQ VI发开始采集的消息。 每个DAQ VI也可以用生产者消费者形式。
其实上面这种方法也相当于放16个消费者循环了,不过程序结构看上去会好些。 主VI如下图所示. 只是示意图. 主VI只负责往DAQ VI发消息,他不做实际的数据采集, 因此永远是马上返回的.
DAQ VI如下, 每个都类似. 用Queue的名字来区分, 比如DAQ One, DAQ Two,。。。 主VI则是通过这个名字来访问这些不同VI的QUeue, 并给他们发DAQ Start 的消息。 DAQVI收到 DAQ Start之后则可以做数据采集的事情,所有DAQ VI之间互不影响。
一周热门 更多>