最近GSD论坛上的一个帖子谈到了大局变量的问题:
sandan0615:
在确保数据不抵触的状况下能够对大局变量写操作吗?
RTRT,各位高手解说下,我在陈树学教师的宝典里看到说在程序里要防止对大局变量进行写操作。
czhen:
当然能够
不可的话,要它干啥
wyb4993:
我有一个自动化测验程序,里边有许多LabVIEW大局变量,能够读和写。是前一任离任的兄弟留下的。现在运转很正常。
关于慎用大局变量的问题,许多编程言语方面的书本都会提及,NI论坛上有一个长达十几页的帖子专门评论的这个问题,十分具体。
其间不只是触及大局变量,还提及了许多解决问题的技巧。
下面我大约翻译一下其间重要的部分,期望有助于了解怎么正确运用大局变量。帖子很长,我需求用几天的时刻连续给咱们介绍。
——————————————————————————————————————————-
TBOB:
不止一次地看到人们在诉苦,大局变量是罪恶之源,底子就不应该运用它们。可是我不认为这个结论是清楚明了正确的。我期望能听到一次有关大局变量的郑重其事的评论。论坛中的朋友们许多都提到了他们都正在编程中运用大局变量。
先从大局变量的有点谈起。一般来说,大局变量是公认的在各个VI之间传递数据的有用办法,比起其它办法的大局变量(个人定见)更简略办理,由于假设咱们运用了一个簇作为大局数据,咱们没有办法确定在何处运用了它们,或许需求自己创立一个文件记载它们运用的方位。可是大局变量则否则,经过大局变量的右键便利菜单,咱们能够很容找到引证大局变量的方位。
运用大局变量有两个晦气之处,其一,引证大局变量需求创立数据的复制,这或许会导致潜在的竞赛条件或许导致数据的丢掉。其二,运用大局变量会中止数据流程。
所以,我对那些对立运用大局变量的人士提出一个问题—你们在运用大局变量时考虑了大局变量是否有用的问题了吗?
假如对大局变量只需一个写入者,而有多处读取者,您只是关怀变量的最新写入值的状况下,您怎么能判定不能运用大局变量呢?
—————————————————————————————————————————
Darren:
大局变量在某些状况下是十分好用的。假如我有一些静态数据,这些静态数据有必要在多个VI中同享,这种状况下,我会运用大局变量存储这些静态数据。(所谓静态数据便是不需求改动的数据,常量)。最常见的比方是需求给用户提示的文本字符串。假如我有一个十分复杂的GUI,需求在许多当地向用户提示文本信息。我会创立一个大局变量VI,把这些字符串创立为大局变量,而且依照字母次序排序(经过设置TAB ORDER)。这样咱们需求在程序框图中运用大局变量时,直接拖入并挑选咱们需求的。这种办法能够很简略使咱们的运用程序本地化,由于一切的显现字符串会集在一个VI之中,而不是分布在各个VI之中,很简略会集处理。
我别的一次运用大局变量是在一个子面板运用中,由于我的子面板中的VI不需求和主VI交流信息,所以我将子面板VI中的数据写入大局变量,供运用程序其它部分读取。由于不需求同步化以及只需子面板中的VI写入数据,确保了只需一个写入者,这恰恰是大局变量的最佳作业办法。
——————————————————————————————————————–
TBOB:
很快乐能看到同人谈及怎么恰当地运用大局变量,而不是简略地说完全不要运用大局变量。咱们更应该着重怎么恰当地运用大局变量,协助人们了解数据竞赛是怎么发生的,以及怎么防止竞赛状况呈现。
我大多数运用大局变量时,是把大局变量作为常量来运用的,比方保存一个GPIB的地址。它们一旦创立后就永久不会再次写入更改,这种状况下,肯定不会呈现数据竞赛的状况。或许在出产顾客形式中,出产者写入大局变量,而顾客读取大局变量。这种状况下,读的机遇是十分重要的。我使顾客不断查询大局变量,是否和本来的值发生变化。换句话说,顾客在数据更新之前或许读取了两次,当然并不很抱负。
关于局部变量也是如此,总有它们适宜运用的场合,可是有必要当心或许会导致的问题。教会人们发现问题和解决问题好于只是说防止运用它们。
——————————————————————————————————————————–
Jasonhill:
我也常常看到要求制止运用大局变量,在适宜的条件下,运用大局变量仍是十分有用的。可是程序员仍是会不自觉地倾向于乱用它们,任何变量(大局变量、局部变量、LV2大局变量)在运用时需求分外当心,“连线”仍是最安全的。
我十分厌烦上下或许左右堆积很多的控件,在程序框图中多达20几个层叠次序结构中,处处分布一些大局变量或许局部变量。
至于你提及的出产者顾客形式,我仍是乐意运用行列来完结,运用行列能够使咱们不需求考虑读的机遇问题。
—————————————————————————————————————————–T
TBOB:
在出产者顾客形式中,运用行列(我也倾向于运用行列,而不是变量)相同存在问题。顾客或许运转速度高于顾客,此刻或许读回空数据,有必要在编程中查看是否是否读回空数据。
—————————————————————————————————————————-
TST:
在出产顾客形式运用行列时,我乐意运用超时的默认值-1,这意味着顾客在没有数据时不会履行一个循环,也不需求查看超时是否发生了。
——————————————————————————————————————————
TITOU:
真是个好标题!
大局变量是魔鬼吗?——我乐意这样答复:不是,只需你遵从了大局变量的作业规矩。
我常常主张防止运用大局变量,可是确实在特定的场合,我仍是会运用大局变量,由于运用大局变量确实十分便利。
运用但不要乱用。
——————————————————————————————————————————–
ROBERT:
即便在根据文本的编程言语中,选用封装和笼统自身就倾向于不运用大局变量。抱负的结构应该是这样的,假如函数需求一个变量,有必要从函数的调用者哪里接纳这个变量。尽管如此,即便在这样的编程环境中,仍是需求有极限的和合理的使用大局变量。正如上面的帖子中指出的那样,一个写入者,多个读取者。亦或需求在整个程序运用,可是不需求改动的场合。
我常常采样下面的办法。在程序启动时,先运转一个装备函数或许“参数设置”函数,此刻没有其它的进程作业,数据收集也没有进行。此刻为程序的其它部分创立大局变量是合理的。