labview中的消息队列中间件框架怎么理解

操作者框架 - National Instruments
选购测量产品
操作者框架
“操作者框架”模板创建的LabVIEW应用程序可包含多个需要互相进行通信的独立任务。该框架专门设计用于解决常见开发情形中遇到的问题:扩展功能或添加其他处理时需要大量复制代码。
每个操作者被定义为一个LabVIEW类,启动操作者的一个实例可实例化LabVIEW类,操作者实例由LabVIEW对象表示。基础操作者类(“操作者”)的所有子孙类都包含“操作者核心”方法,其作用相当于一个队列消息处理器。该VI接收并响应系统中其他操作者发送给它的消息和数据。但由于操作者是LabVIEW类,因而比传统的队列消息处理器更容易重复使用和扩展。
本模板包含三个操作者:应用程序(Application)、Alpha和Beta,同时还演示了它们彼此之间进行通信的方式。
注   本模板大量使用LabVIEW类。使用“操作者框架”设计应用程序要求熟悉LabVIEW面向对象编程原理。本文档提供了理解和修改“操作者框架”模板所需的相关信息。关于使用“操作者框架”设计应用程序的详细信息,见项目浏览器窗口中Project Documentation文件夹下的Actor Framework Whitepaper。
关于修改本模板以用于应用程序的范例,见创建项目对话框中的“反馈式蒸发冷却器”范例项目。
2. 开发者走查
关于本模板开发者走查的详细信息见ni.com。
3. 系统要求
基础版、完整版或专业版开发系统
4. 使用条件
“操作者框架”适用的应用程序为:需要复制大量代码,但每个副本改动不大的情况。使用这种方法开发大中型应用程序十分困难,尤其是用户需要维护和扩展应用程序的时候。
例如,假设一个测量应用程序需要连续同时进行应变测量和电阻测量。传统的操作方法可能如下:创建一个进行应变测量的队列消息处理器,复制该队列消息处理器,修改副本以进行电阻测量,然后将两个队列消息处理器合并在一个应用程序中。这样的操作方式导致两个队列消息处理器共用大量相同的代码,但彼此之间又有细微的差别。如修改程序的某个部分,则必须在另一个程序中跟踪并复制这些修改。
使用“操作者框架”方法时,首先需要确定两种测量类型共有的功能,如下列步骤所示:
获取硬件设备的引用
连续进行测量
连续处理测量
连续向用户显示处理后的测量结果,附带显示之前测量的历史记录
关闭硬件设备的引用
每个步骤类似于队列消息处理器中的一个状态,或消息框图。尽管两种测量中这些步骤相同,但每种测量特定的命令有所区别。例如,使用的硬件设备不同,采集数据的VI不同,应用于测量的处理也各不相同。
“操作者框架”面向对象的方法解决了可扩展性和重复使用的问题,同时还提供其他功能。使用“操作者框架”可将上述通用功能封装到一个“测量”操作者中。“测量”操作者是一个LabVIEW类,本身无法进行测量;相反,它的成员VI可以从总体上定义需要哪些步骤。每个步骤都和类中的一个成员VI相关联。
由于“测量”操作者是一个LabVIEW类,因此可创建两个从“测量”操作者继承特定功能的子操作者:一个“应变”操作者和一个“电阻”操作者。子操作者将继承父操作者的功能,但同时还会添加与应变或电阻相关的特定操作,从而使得这些操作者可以进行连续测量,并处理和显示测量结果。这种方法将通用功能封装到一个单独的点(“测量”操作者),从而将代码的重复使用性最大化,定义特定的命令则由其子操作者完成。
此外,由于每个操作者是一个独立的实体,因而应用程序可以将操作者动态加载到内存。例如,可设置这样一个应用程序:单击一个按钮,进行应变或电阻测量。没有“操作者框架”,要实现这种功能十分困难,耗费时间且容易出错,尤其是计划将来修改或扩展应用程序的时候。“操作者框架”就是为了这些应用程序而设计的。
5. 运行本模板
按照下列步骤运行本模板:
在项目浏览器窗口,打开并运行应用程序启动器.lvlib:Splash Screen.vi。
查看事件记录中的消息,它们是每个嵌套操作者(Alpha和Beta)发送至顶层操作者(应用程序)的消息。
单击发送Alpha消息。应用程序操作者发送一个消息至Alpha操作者。查看事件记录的响应。
单击发送Beta消息。应用程序操作者发送一个消息至Beta操作者。查看事件记录的响应。
单击停止全部可停止应用程序。
6. 操作者框架组成部分
“操作者框架”由操作者和消息构成。消息在消息队列中传输。为减少出错和提高应用程序的可靠性,“操作者框架”限制了能够互相发送消息的操作者。
操作者是LabVIEW类,代表某个任务的状态。所有操作者类均从LabVIEW中的“操作者”类继承。该类由三个主要部分构成:
操作者的核心VI-核心VI是一个特定命名的方法(“操作者核心”),用来定义操作者的连续行为。该方法定义了所有操作者的消息处理行为。该类的子孙类重写方法以显示操作者的用户界面、添加并行循环和启动嵌套操作者。
操作者的特定方法-这些VI是LabVIEW类的成员VI,用于定义操作者。通常每个方法对应于操作者能够执行的一个任务。祖先类(“操作者”类)包含几个专门设计用于被子孙类重写的方法。
操作者的消息-消息是一个LabVIEW类,定义了操作者能够接收的指令和作出响应的方式。其他操作者将这些消息发送至一个操作者,以便让操作者调用其中的一个方法。在“操作者框架”基础上创建应用程序时,通常需要为操作者的每个方法定义一个消息。所有消息均从LabVIEW中的“消息”类继承。
虽然消息本身并不是操作者的一部分,但用户通常在定义操作者的同时定义了操作者的消息。由于这种紧密的联系,模板将操作者和消息放在同一个项目库中。
例如,下面截图显示的项目库包含一个操作者Alpha(Alpha类)和一个消息(Alpha任务消息类)。
上面的截图显示了与该操作者相关的下列文件:
操作者的核心VI是操作者核心。该方法重写其祖先的“操作者核心”方法,定义了Alpha操作者特有的连续行为。
操作者的方法是停止核心和任务。这些方法在下列条件下执行:
停止核心在Alpha操作者收到“停止”消息时执行。该方法重写“操作者”类的“停止核心”方法,用于定义Alpha操作者特有的行为。
任务在Alpha操作者收到“任务”消息时执行。该方法为Alpha操作者特有,即“操作者”类中未定义该方法。
操作者的消息包含在Alpha的消息文件夹中。该操作者仅定义一个消息,即Alpha任务消息,该消息从“消息”类继承,包含下列文件:
Alpha任务消息控件是该消息携带的数据。
发送Alpha任务是其他操作者用来发送“任务”消息至Alpha操作者的VI。该VI将创建消息的一个实例并用一些数据填充消息。
执行定义了Alpha收到“任务”消息时执行的动作。本模板中,“执行”VI命令Alpha执行其“任务”方法。
注  
Alpha类包含一个“停止核心”方法,该方法收到“停止”消息时执行;但本模板未定义一个“停止”消息。“停止消息”类在操作者框架中定义;所有操作者均从“操作者”类中继承了处理该消息的能力。子孙类(如Alpha)仅需重写“停止核心”方法。
Alpha类无需定义接收和响应消息的过程。该行为在“操作者”类的“操作者核心”方法中定义并被所有操作者继承。
最小化操作者之间的通信错误
默认情况下,一个特定的操作者X仅可将消息发送至下列操作者:
调用方-启动X的VI(可能是一个操作者)
嵌套操作者-X启动的任何操作者
这种被限制的通信顺序称为任务树。这表明仅有一个通信路径需要管理,因而很容易写入代码,确保关闭之前其他操作者有机会接收消息并作出响应。
例如,本模板定义了下列任务树:
其中项目_名称指用户给项目的命名。
该图表明应用程序操作者同时启动Alpha和Beta操作者。因此,应用程序操作者被称为顶层操作者。顶层操作者启动所有其他操作者。顶层操作者本身从一个正常VI启动。
注  任务树层次结构与LabVIEW类继承层次结构有所不同。虽然Alpha和Beta从应用程序启动,但Alpha和Beta类并不从项目_名称类中继承。
在该任务树中,下列通信规则有效:
应用程序可将消息发送至Alpha和Beta
Alpha仅能将消息发送至应用程序
Beta仅能将消息发送至应用程序
这说明Alpha和Beta无法将消息发送至对方。Alpha必须发送一个消息至应用程序,确定Beta是否需要接收该消息并采取相应的动作。同样,限制通信路径有助于写入更多易于管理和正确无误的代码。
下面的程序框图显示了项目_名称类中“操作者核心”方法的代码,该代码通过启动Alpha和Beta定义任务树:
消息通过队列发送。为了限制任务树,每个操作者最初仅可访问下列两个消息队列:
操作者用来将消息发送至调用方的队列
操作者用来将消息发送至自身的队列
访问一个队列与队列本身有所不同。为避免其他操作者释放其消息队列,操作者并不共享自身的队列。相反,操作者框架引入了待入队列的概念。待入队列是一个引用,可使操作者发送消息至队列,但不执行其他任何操作。
例如,假设操作者X已经在运行。启动时,X获得一个用来发送消息至自身的队列。在X看来,该队列是至当前类队列。如X启动Y,则发生下列动作:
X是Y的调用方,因此X允许Y访问X的至当前类队列。在Y看来,该队列是至调用方队列。队列相同,但有两个不同的观察角度。
Y获得一个发送消息至自身的队列。在Y看来,该队列是至当前类队列。
Y允许X访问步骤2中获得的队列。
现在Y可以访问两个队列:
至调用方队列-步骤1中X允许Y访问的队列。注意该队列和X用来与自身通信的队列相同。
至当前类队列-步骤3中Y为自身获得的队列。
下图显示了这两个操作者互相进行通信的方式:
现在X能够将消息发送至自身(1)和Y (2)。Y能够将消息发送至X (3)和自身(4)。尽管有四个消息可进入的方向,但只包含了两个队列。此外,两个操作者都无法释放对方的队列。相反,每个操作者释放自身的队列,作为其关闭程序的一部分。
7. 项目层次结构
在本模板的基础上创建项目后,LabVIEW将显示下列层次结构:
Project Documentation-包含关于模板的相关文档。用户开发和分布项目时,National Instruments建议对该文档进行相应的更新。
项目_名称启动器库-关于启动顶层应用程序的文件。
本地化-将所有用户面对的字符串集中到一个VI,有助于字符串的翻译。
初始屏幕-执行“加载应用程序”VI时显示初始屏幕。
项目_名称库-包含应用程序操作者及其能够接收的消息。
项目_名称的消息-包含应用程序操作者能够接收的消息。
记录事件消息类-定义一个消息,该消息命令应用程序操作者用字符串更新其事件记录。
发送记录事件-发送“记录事件”消息至应用程序操作者,附带一个字符串作为数据。Alpha和Beta操作者均发送该消息至应用程序操作者;因此,该VI从Alpha和Beta操作者的“任务”方法中调用。
执行-使用“发送记录事件”VI携带的数据,命令应用程序操作者调用其Log Event.vi方法。
项目_名称类-“应用程序”操作者。
本地化-将所有用户面对的字符串集中到一个VI,有助于字符串的翻译。
操作者核心-操作者的核心VI,执行下列任务:
启动Alpha和Beta操作者。
允许这些操作者访问队列,发送消息至应用程序操作者。
等待前面板事件。
通过发送消息至Alpha和Beta操作者,响应这些事件。
读取配置文件-从配置文件中读取整数。
停止核心-发送“停止”消息至Alpha和Beta操作者。
记录事件-滚动项目_名称类中“操作者核心”前面板上的事件记录文本框。
加载应用程序-启动项目_名称操作者,从而启动应用程序本身,并将正在加载的状态发布至“初始屏幕”VI。
Alpha操作者库-包含Alpha操作者及其能够接收的消息。
Alpha的消息-包含Alpha操作者能够接收的消息。
Alpha任务消息类-定义一个命令Alpha操作者执行其Task.vi方法的消息。
发送Alpha任务-发送“任务”消息至Alpha操作者,同时附带发送一些数据。该VI从项目_名称类的“操作者核心”方法中调用。
执行-使用“发送Alpha任务”VI携带的数据,命令Alpha操作者运行其“任务”方法。
写入数据-将整数捆绑至Alpha操作者从其“操作者核心”方法发送的“任务”消息。
Alpha类-Alpha操作者。
本地化-将所有用户面对的字符串集中到一个VI,有助于字符串的翻译。
操作者核心-命令Alpha操作者每n毫秒执行其Task.vi方法,数据为-1。接收“任务”消息命令Alpha执行其“任务”方法,但数据不是-1。
停止核心-阻止传递定时消息(在“操作者核心”方法中定义)。
任务-发送一个“记录事件”消息至应用程序操作者,附带一个整数。
Beta操作者库-包含Beta操作者及其能够接收的消息。这些文件的结构和功能类似于Alpha Actor.lvlib中文件的功能,但有两个例外:
Beta类与Alpha类的的“操作者核心”方法运行方式各不相同。
“Beta任务消息”类中不包含“写入数据”方法。
8. 修改本模板
操作者是一个LabVIEW类。和其他LabVIEW类一样,创建之前必须明白操作者的含义及其作用。
为了明确待创建的操作者的类型及其功能,需考虑应用程序中独立运行的任务以及每个任务能够执行的动作。例如,假设一个从模拟设备中进行连续测量的任务。该任务需明确如何连接至硬件、连续采集测量结果、将安全值写入硬件以及从硬件断开。此任务的操作者可能对于每个动作都有一个方法。为每个确定的任务创建一个操作者。
明确操作者需执行的动作后,还需确定操作者运行时哪些动作连续发生,哪些动作仅在从另一个操作者收到消息后发生。连续发生的动作应添加在操作者的“操作者核心”方法中。响应消息而发生的动作应表示为操作者类的一个方法。使用该信息定义操作者行为。然后,创建消息,命令操作者调用每个方法。
定义操作者行为
操作者框架提供两种定义操作者行为的方法。必须首先确定下列何种方法比较合适:
对于响应消息而发生的行为,应首先创建操作者方法,然后创建触发方法的消息。
例如,从硬件设备中采集单次测量结果就是一种响应消息而发生的行为。该动作的开头和结尾明显有别,且不需要连续执行。该动作的持续时间比操作者自身的持续时间短。
对于操作者运行时应连续发生的动作,需要重写“操作者核心”方法。
例如,监控用户界面并对事件作出响应就是一种应该连续发生的动作。该动作在操作者运行的整个过程中都需要发生;即与操作者自身的持续时间相等。
创建操作者方法
在类中创建一个成员VI。注意祖先操作者类的一些方法是专门设计用于被重写的。
创建消息以命令操作者调用该方法。
确保应用程序的另一部分发送消息至操作者。
定义操作者的连续行为
操作者类的“操作者核心”方法包含对发送至操作者的消息进行处理和响应的代码。每个操作者都继承了这种行为。操作者处理消息时,可连续执行其他动作。如需定义操作者的连续行为,可在子孙类中重写“操作者核心”方法。
下面的截图显示了本模板中重写“操作者核心”方法的三个操作者:
创建操作者
创建一个LabVIEW类并将其设置为从Actor Framework.lvlib:Actor.lvclass继承。
定义操作者的行为。
创建操作者可接收的消息。
确保应用程序的另一部分启动操作者。
确保应用程序的其他部分发送消息至操作者。
创建停止操作者的代码。
停止操作者
如需停止操作者,可通过使用一个下列VI,发送停止消息至操作者:
发送标准停止
发送紧急停止
发送标准或紧急停止
这些方法可以在函数选板中找到。关于停止操作者范例的详细信息,见项目_名称类的“停止核心”方法。
启动操作者
通过使用函数选板上的“启动操作者”方法可启动一个操作者。关于启动顶层操作者范例的详细信息,见“加载应用程序”VI中的下列代码:
关于启动嵌套操作者范例的详细信息,见项目_名称类中“操作者核心”的下列代码:
消息是LabVIEW类,可命令操作者调用一个方法。按照下列步骤,为操作者创建一个消息:
确保已打开包含操作者的一个LabVIEW项目。
启动操作者框架消息制作器对话框:
选择要创建消息的方法。例如:
单击生成选中项。单击该按钮后,LabVIEW将创建方法消息.lvclass,并将其插入项目浏览器窗口。其中,方法就是用户之前选择的方法。例如:
LabVIEW同时也打开类的成员VI,其中:
方法消息.lvclass:方法消息.ctl是消息可访问的私有数据。
方法消息.lvclass:发送方法.vi是用来发送消息至操作者的VI。
方法消息.lvclass:Do.vi定义了操作者收到该消息时的动作。默认情况下,Do.vi命令操作者调用方法.vi。
用户可根据应用程序的实际需求定制这些VI。
发送消息。
如需发送消息,可使用方法消息.lvclass:发送方法.vi。其中,方法是希望接受方操作者执行的方法。创建消息时已创建“发送方法.vi”。
注  关于发送停止或紧急停止消息的详细信息,见停止操作者。
本模板中关于发送消息的范例,见下列VI:
Beta类的“操作者核心”方法-发送“记录事件”消息至应用程序操作者。
Beta类的“任务”方法-发送“记录事件”消息至应用程序操作者。
Alpha类的“任务”方法-发送“记录事件”消息至应用程序操作者。
项目_名称类的“操作者核心”方法-
发送“Alpha任务”消息至Alpha操作者。
发送“Beta任务”消息至Beta操作者。
修改应用程序操作者发送消息至Alpha操作者时发生的事件
项目_名称类的“操作者核心”方法中,事件结构的至Alpha的消息事件分支定义了应用程序操作者发送消息至Alpha操作者时发生的事件。按照应用程序的实际需求,对该事件结构进行修改。
修改应用程序操作者发送消息至Beta操作者时发生的事件
项目_名称类的“操作者核心”方法中,事件结构的至Beta的消息事件分支定义了应用程序操作者发送消息至Beta操作者时发生的事件。按照应用程序的实际需求,对该事件结构进行修改。
修改应用程序操作者停止时发生的事件
下列位置定义了应用程序操作者的停止行为:
项目_名称.类的“操作者核心”方法中,事件结构的"Stop": 值改变; 前面板关闭事件分支-该事件分支将应用程序操作者的“停止”消息发送至自身:
应用程序操作者收到该消息后,“停止消息”类的“执行”VI将生成错误代码43,表示操作者停止时无错误,且将执行项目_名称类的“停止核心”方法。操作者类的“操作者核心”方法中定义了该行为。
同一事件结构中的应用程序实例关闭事件分支-无论应用程序如何关闭,该分支中的代码都会运行直到彻底完成。可在该分支中根据需要添加清理代码,如在本例中是将硬件重置为安全状态。
项目_名称类的“停止核心”方法-默认情况下,该方法向Alpha和Beta操作者发送“停止”消息。
如在Alpha和Beta同一层次结构上创建嵌套操作者,需修改该VI,通知这些嵌套操作者也同时停止。这些操作者包含自身的停止行为,可进行修改。
修改Alpha和Beta停止时发生的事件
类的“停止核心”方法中定义了这些操作者的停止行为。默认情况下,这些方法关闭在操作者的“操作者核心”方法中启动的并行任务。按照应用程序的实际需求,修改这些方法中的代码。
如需修改本模板使Alpha或Beta启动任何嵌套操作者,确保操作者的“停止核心”方法发送正确的“停止”或“紧急停止”消息至嵌套操作者。
修改用户界面
通常操作者的用户界面在其“操作者核心”方法中定义。本模板中,只有应用程序操作者在其“操作者核心”方法中定义用户界面。该VI的前面板为应用程序的用户界面。按照应用程序的实际需求,对该用户界面进行修改。
文档中使用的名称
有效的文件名称
应用程序启动器库
Application Launcher.lvlib
Application Launcher.lvlib:Localization.vi
初始屏幕VI
Application Launcher.lvlib:Splash Screen.vi
项目_名称操作者库
Project_Name Actor.lvlib
记录事件消息
Project_Name Actor.lvlib:Log Event Msg.lvclass
记录事件消息:执行VI
Project_Name Actor.lvlib:Log Event Msg.lvclass:Do.vi
记录事件消息:发送记录事件VI
Project_Name Actor.lvlib:Log Event Msg.lvclass:Send Log Event.vi
Project_Name Actor.lvlib:Project_Name.lvclass
项目_名称:操作者核心VI
Project_Name Actor.lvlib:Project_Name.lvclass:Actor Core.vi
项目_名称:加载应用程序VI
Project_Name Actor.lvlib:Project_Name.lvclass:Load App.vi
项目_名称:本地化VI
Project_Name Actor.lvlib:Project_Name.lvclass:Localization.vi
项目_名称:记录事件VI
Project_Name Actor.lvlib:Project_Name.lvclass:Log Event.vi
项目_名称:读取配置文件VI
Project_Name Actor.lvlib:Project_Name.lvclass:Read Config File.vi
项目_名称:停止核心VI
Project_Name Actor.lvlib:Project_Name.lvclass:Stop Core.vi
Alpha操作者库
Alpha Actor.lvlib
Alpha任务消息
Alpha Actor.lvlib:Alpha Task Msg.lvclass
Alpha任务消息:执行VI
Alpha Actor.lvlib:Alpha Task Msg.lvclass:Do.vi
Alpha任务消息:发送Alpha任务VI
Alpha Actor.lvlib:Alpha Task Msg.lvclass:Send Alpha Task.vi
Alpha任务消息:写入数据VI
Alpha Actor.lvlib:Alpha Task Msg.lvclass:Write Data.vi
Alpha Actor.lvlib:Alpha.lvclass
Alpha:操作者核心VI
Alpha Actor.lvlib:Alpha.lvclass:Actor Core.vi
Alpha:本地化VI
Alpha Actor.lvlib:Alpha.lvclass:Localization.vi
Alpha:停止核心VI
Alpha Actor.lvlib:Alpha.lvclass:Stop Core.vi
Alpha:任务VI
Alpha Actor.lvlib:Alpha.lvclass:Task.vi
Beta操作者库
Beta Actor.lvlib
Beta任务消息
Beta Actor.lvlib:Beta Task Msg.lvclass
Beta任务消息:执行VI
Beta Actor.lvlib:Beta Task Msg.lvclass:Do.vi
Beta任务消息:发送Beta任务VI
Beta Actor.lvlib:Beta Task Msg.lvclass:Send Beta Task.vi
Beta Actor.lvlib:Beta.lvclass
Beta:操作者核心VI
Beta Actor.lvlib:Beta.lvclass:Actor Core.vi
Beta:本地化VI
Beta Actor.lvlib:Beta.lvclass:Localization.vi
Beta:停止核心VI
Beta Actor.lvlib:Beta.lvclass:Stop Core.vi
Beta:任务VI
Beta Actor.lvlib:Beta.lvclass:Task.vi
9. 重要信息
(C) 2012 National Instruments.版权所有
根据版权法,未经National Instruments公司事先书面同意,本发行物不得以任何形式(包括电子或机械形式)进行全部或部分复制或传播,包括影印、录制、储存于任何信息检索系统中,或翻译。
National Instruments公司尊重他方的知识产权,也恳请用户能给予我们同样的尊重。NI软件受版权法及其他知识产权法的保护。在将NI软件用于复制为他方所有的软件或其他资料的任何场合,NI软件仅可用于在符合许可证或其他法律限制的情况下复制上述资料。
最终用户许可协议和第三方法律声明
可在下列位置找到最终用户许可协议(EULA)和第三方法律声明:
<National Instruments>\_Legal Information和<National Instruments>目录下有法律声明。
<National Instruments>\Shared\MDF\Legal\license目录下有最终用户许可协议。
如需使NI产品生成的安装程序中包含法律相关信息,请参考<National Instruments>\_Legal Information.txt。
LabVIEW、National Instruments、NI、ni.com和National Instruments公司标识,以及鹰形标识均为National Instruments Corporation的商标。关于其他National Instruments商标的详细信息见ni.com/trademarks的Trademark Information部分。
此处提及的其他产品和公司名称均为其各自公司的商标或商业名称。
关于NI产品和技术的专利权,请查看软件中的帮助>>专利信息,光盘中的patents.txt文件,或ni.com/patents上的National Instruments Patent Notice。
书签收藏和分享
NI助力工程师和科学家解决各类工程难题。
关于美国国家仪器公司
800-820-3622
National Instruments Corporation. 上海恩艾仪器有限公司 版权所有.
我们非常重视您的反馈!用心创造滤镜
扫码下载App
汇聚2000万达人的兴趣社区下载即送20张免费照片冲印
扫码下载App
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
阅读(1051)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
在LOFTER的更多文章
loftPermalink:'',
id:'fks_094',
blogTitle:'labview深入探索----谈谈LABVIEW的几种定时器',
blogAbstract:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}

我要回帖

更多关于 labview中开发框架 的文章

 

随机推荐