1现实中的队列
队列估计是我们生活中出现的最频繁的数据形式,各种类型的排队例如银行叫号办理业务,购买火车票飞机票、排队打饭、汽车灯等待红绿灯然后放行、流水线上下架的产品或零部件等都属于队列,与之相反的数据结构是栈后者堆,例如冲锋枪弹夹里的子弹,先打出的子弹是后装填进去的,堆起的货物,一般先取出来的是后放置的。
2队列的定义和数据模型
队列是一种先进先出的数据结构,具体工作如下图:
先入队的数据被优先取出。
3.LabVIEW中提供的队列函数
队列函所在的位置如下图
3.1获取队列引用
功能是创建一个队列,
3.1.1名称:指向队列内存的地址,队列已经创建时,再次使用同名称获取队列时,取得的是已经创建好的队列内存地址。
3.1.2元素类型:可以是任意合法的数据。
3.1.3队列最大值:限定队列的长度,-1时无限长。
3.1.4队列输出:为队列的引用。
3.2元素入队列
向队列中添加元素
3.2.1队列:队列的数据引用。
3.2.2元素:需要添加的元素输入端。
3.2.3超时:设置写入时间,-1一直等待直到元素写入。
3.3元素出队列
从队列中取出元素
3.3.1队列:队列的数据引用。
3.3.2超时:等待时间直到有数据出队,如果超过限定时间没有数据出队,则超时输出为真,如果超时设置为-1,则一直等待直到元素出队,此时如果释放队列时,元素出队会报错,可以利用这一特性t停止循环结构,如下图:
3.3.3元素:队列中去取的元素。
3.3.4超时:超时标志位。
3.4释放队列引用
释放队列所占的内存空间,此时队列内存地址值为0x00000000,如果再次使用其进行元素入队出队操作就会报错。
3.5获取列队状态
获取列队中的各种信息
返回元素为True时元素输出为队列中的元素组成的数组。
返回元素为False时只输出信息,不获取队列中的元素。
3.6队列最前端插入
这个函数目的就是插队,让该元素获取更高的优先级,这个在一些软件架构中用比较多。
3.7清空队列
一次性取出当前队列中所有的元素,返回一个元素数组。
3.8有损耗元素入队列
在队列中添加元素。如队列已满,函数可通过删除队列前端的元素使新元素入队。
以上重点掌握1-4四种函数,其它的了解用法即可。
4.队列的应用范围
4.1异步状态机:面我写过一篇异步状态机,在循环间传递状态就是用的队列。
如下图1处是写入状态,2初是出队执行状态
4.2消息队列处理器(QMH)
这个是LabVIEW自带的模板
具体创建位置为文件-》创建项目-》消息队列处理器
修改项目名称,路径,文件前缀,图标即可,也可以直接点完成。
大开Maim显示程序框图,里面有详细的说明,其中上部分事件是命令的产生的位置,下部分是命名的执行主体,每个命令对应一个条件结构,如果需要新添加命令,必须添加对应的条件结构。
其中最重要的一个函数是消息入队。里面的优先级使用了队列前端插入元素。
4.3AMC异步消息处理器
这个工具包可以在VIPM里可以直接下载,以下是工具包的具体位置:
新建一个空白VI,在程序框图放置Templates,结果如下:
AMC与QMH类似,但增加了以下功能:
a可以一次发送多条消息
b增加了对网络通信的支持,在性能要求不高的情况下通过UDP进行消息异步通信。
4.5命令模式
命令模式作为LVOOP 23种设计模式之一,主要使用的是队列传输命令,这个在后面的章节中会详细讲解。
4.6Actor Framework中的消息队列。
下图为操作者消息队列的结构,我能看到的部分,具体还有些设计没有看懂,但是不影响使用。后面章节会针对Actor Framework做专题讲解。
5队列的使用实例
5.1队列的使用顺序要求如下:
5.1.1获取队列引用;
5.1.2元素入队列、出队列等操作;
5.1.3释放队列。
5.2注意:
5.2.1使用顺序一定是先创建队列,后使用队列;
5.2.2当队列完成使用或程序退出是释放掉,以免内存泄漏。
5.3创建实例
我们创建一个生成消费者来演示队列的用法。
5.3.1创建一个工程命名为queue。
5.3.2创建一个VI命名为Product and cost
5.3.3放置两循环,并在上边循环里添加事件结构
5.3.4放置获取队列引用并如下图连线。
5.3.5前面板添加运行和停止控件和波形图表
5.3.6停止按钮值改变事件中添加释放队列,下边循环添加元素出队,并如图连线。
5.3.7将运行按钮的机械动作改成第一个,然后添加stop值改变事件,添加可控的定时事件,注意所有的事件分支全部连好线。
5.3.8在超时事件中添加元素入队,正弦函数计算,如下图连线。
5.3.9看看运行效果
5.4如果我们还要对数据分别数据分析和保存数据怎么办
同理我们可以继续增加循消费循环如下图:
5.4.1增加两个队列,然后根据功能分别命名。
在Stop事件中将队列合并成数组,批量关闭
在超时事件中将队列合并成数组,批量发送数据。
添加循环将队列传递过来的数据保存。
添加循环将队列传递过来的数据进行频谱分析。
最后运行结果如下: