我们知道,LabVIEW图形化程序的运行是基于数据流的。等待(ms内置函数也应该是如此工作。对于数据流的概念似乎很简单、很好理解,其实对于初学者来讲还是会有概念不清晰的时候。

    在csxcs366的文章中我们知道,等待(ms是基于线程的,它的数据流工作方式必须是执行完设计者所设定的等待时间,才能结束这个线程。

    如果程序中还存在其它的线程,就会面临两种情况:一是:在等待(ms函数运行结束前,其它程序应经运行结束,则当前程序结束运行;二是,如果该等待(ms函数线程完成后,还有其它程序仍在运行,依据数据流的关系,只有当所有节点都完成后,当前的程序才会结束运行。

    也就是说,等待(ms函数只完成设计者所规定的定时任务,而后执行什么操作取决于其它程序节点的内容。下面的例子很能说明这个问题。

Picture
图2-1

      在这个例子中,我们使用了两个等待(ms函数,一个定时2000ms,另一个定时10000ms,如果你运行这个程序后就会发现,在程序运行2000ms后,比较器的输出为“T”,并将该值输出到While循环的条件端,可是While循环并没有马上停下来,而是等待10000ms定时结束后才停下来。

    这也就说明:对于整个While循环而言,它必须在它的内部所有程序运行结束后,才能退出While循环。这个例子进一步说明了数据流和节点的概念以及它们之间的相互关系。

      Csxcs366的另一个试验也证明了这一点。

    在一个循环里安置多个等待(ms函数,到底是累加时间,还是按最长的执行那,实际上是异步的还是同步的问题。下面的实验将会给出证明。

Picture
图2-2
       试验结果告诉我们,这三个等待(ms)函数是同步执行的。

    由于等待(ms)函数是基于线程的,所以一个循环里的等待(ms)函数不会影响其它同时运行的线程,但一定是按最长的等待定时来执行。

     现在我们知道,等待(ms函数是很执着的,无论在什么情况下它都会首先完成自己的份内工作。这样就会带来一个问题,在等待(ms函数定时时间很短时,一般不会有什么影响,耐心等待就是了。可是如果定时时间较长,比如:十几分钟或1小时,我们想结束正在进行的定时等待状态,那又将如何处理呢?

     实际图1-8就已经给出了一个解决的方法,就是细分定时时间,然后利用可停止的for循环来进行控制。整理后见图2-3

Picture
图2-3

      如果你的程序结构许可的情况下,还可以采用下面图示的方法。通常不推荐使用这种方法,它类似于LabVIEW开发环境下的“强制退出”按钮。

Picture
图2-4
注意:
      关于定时While循环的停止问题,请参见本站的csxcs366 Blog专栏的网友问答中“如何停止定时循环”一文。

尊重别人就是尊重自己
转载请注明出处

Picture
 


Comments

09/25/2012 00:06

good post

Reply



Leave a Reply


Google Analytics