看完了你的需求目的,我得遗憾的告诉你:生产/消费者结构不能达到“同时”的效果,但是可以实现“实
时”的效果。
我们知道,“The Producer / Consumer pattern is commonly used when acquiring multiple sets
of data to be processed in order”。in order这个特性注定了不能实现“同时”。
在实时系统中,一个应用通常由一组任务构成,每个任务完成应用中的一部分功能,组合后为用户提供特定的
服务。实时任务的分类方法有多种。根据是否允许任务超时,及时超时后对系统造成的影响,任务又分为以下
4类:
强实时任务(Hard Real-Time Task):通常是指那些必须在规定的时间内完成的任务,不允许它的任何任
务实例超时。若有任务实例未在截止期限内完成,则会对系统造成不可估量的损失。一般采用在最坏情况下任
务的响应时间对强实时任务进行可调度性分析。如果存在最大响应时间大于截止时限的任务,则认为该系统不
可调度。
准实时任务(Firm Real-Time Task):通常是指允许任务超时,但若任务超时,该任务的计算结果没有任
何意义。
弱实时任务(Soft Real-Time Task):通常是指允许任务超时,但超时后的计算结果仍有一定的意义,并
且其意义随着超时时间的增加而下降。
弱—强实时任务(Weakly Hard Real-Time Task):弱—强实时任务通常是周期任务,并且具有允许周期
任务的一些任务实例超时,但这些超时的任务实例的分布应满足一定的规律的特性。将这种要求称为超时分布
约束。若不满足超时分布约束,则会造成系统动态失效。
所以,我建议你做一个准实时任务的系统。你消费者的while循环框个数可以有3个,分别是保存、分析和显
示。也可以把它们并入一个消费者的while循环框,然后用Case结构区分开。我觉得用后者就能满足你的要
求,而且程序的可读性要好一点。另外,队列组只需要一组就行了,不需要搞3组。
Hi gangzi,
- 对于数据采集和分析系统来说,我们首先要保证的是实时性,也就是说不能因为你显示和处理的开销导致采集丢帧。
- 另外,如果是在线监控程序,那么你的处理过程也要尽可能快,不希望出现异常发生1分钟了,你还没有报警。
- 至于保存,我想不出对他有什么实时性的要求。
- 所以,我建议你可以用第一种模式。如果你对在线监控有实时要求,你可以把处理也单独列为一个消费者。
- 但是,尽量避免建立多个队列传递重复的消息。这回造成同一份数据的多个拷贝。
Queue data can be any type i.e. Cluster
PS: You may queue in a cluster of three different data types
- 你可以用一个express VI来同时采集3个DAQ卡的数据, 配置不同的通道到不同的卡就可以。
- 你的程序如果是一直跑着很长时间,那么你的logging也要足够快,否则内存就被耗光了。这样看起来,你还是得选用第一种模式,但是从queue里面取出数据之后你把他分三根线引入显示,logging和processing,LV会帮你做并行。程序跑到一定时间之后必须达到动平衡,否则你的内存资源肯定不够。多个consumer解决不了问题。
- 显示可以降采样,没必要显示那么精确,反正眼睛分辨不出来。