本节将运用“多循环”来处理程序并行运转的问题,那么程序中的两个循环怎么进行数据交互和同享呢?最一般的方法是选用全局变量或局域变量,可是当两个循环履行的速率不相等时,必然会形成数据的丢掉或重复。如前所述,LabVIEW供给了行列操作函数,答应数据的发送者和接受者之间树立一条缓冲通道,这样就避免了循环不同步带来的影响。
如图 37所示,将整个进程与供水系统进行类比,在数据发生/收集端(供水局)发生数据后,并不直接向终端用户供水,因为前者发生水的速率与后者耗费水的速率并不相同。此刻需求制作蓄水池将供水局发生的水放入到蓄水池中,同理获取的数据也放入该缓冲区中。当终端用户需求用水时,直接从蓄水池中获取就能够了,同理在进行数据显现和剖析时直接从数据缓冲区中获取就能够了。
图 37 出产者/顾客模型
当然,上面的模型也会存在一个问题:数据缓冲区/蓄水池的容量?假定供水局不停地发生自来水,而终端用户却不耗费水,这样便会导致蓄水池装满而溢出。反之当终端用户耗水量太大时,导致没有水可用。LabVIEW中的行列函数供给了一种很好的方法规避了这个问题,因为行列中的元素是“先进先出”的,因而保证了接纳到的数据是有序的。在LabVIEW的行列操作中(入列和出列函数),供给了timeout选项以处理数据缓冲区的溢出或缺乏。当数据溢出时,入列函数(数据进入行列)将中止发送数据(处于等候状况),直到缓冲区存在数据空间或许达到了timeout设置的时刻;而当数据缺乏时,出列函数(数据流出行列)将中止接纳数据(处于比及状况),直到缓冲区进入了新的数据或许达到了timeout设置的时刻。
【使用6】
图 38 出产者/顾客例程的前面板
图 39所示为出产者/顾客例程的背面板,代码由3个循环组成,依上而下分别是出产者循环(发生sine数据)、顾客循环(获取sine数据)和状况循环(取得缓存区中数据的数据量)。例程假定正常的数据发送和接纳的速率是延时50ms,当需求某一段的速率减慢时需求将循环的延时设置为100ms。
例程将入列和出列函数的timeout设置为-1,表明假如没有满意条件进行入列和出列操作,循环将处于继续等候状况。在新建行列时,设置了缓冲区的巨细是20个元素(图中的赤色圆圈内)。最下面的循环是为了实时检查行列缓冲区中存储的元素数量。
图 39 出产者/顾客例程的背面板
运转该VI,默许的操作方法是“出产速率等于消费速率”,从图 40中能够看出出产者循环和顾客循环的数据是同步的,此刻缓冲区内没有数据,也就是说发生的数据都被实时地耗费了。
图 40 出产速率等于消费速率
假如再将操作方法设置为“生成快于消费”,能够看出数据缓冲区内将逐突变满并坚持为20个元素。此刻出产者的波形将会比顾客多20个数据点(这些点保存在数据缓冲区中),如图 41所示。