《LabVIEW与多线程实用教案》由会员分享,可在线阅读,更多相关《LabVIEW与多线程实用教案(74页珍藏版)》请在金锄头文库上搜索。
1、1目录目录(ml)多线程技术( jsh)LabVIEW多线程环境LabVIEW多线程程序设计LabVIEW线程通信与同步提示与建议习题第1页/共73页第一页,共74页。2多线程技术多线程技术(jsh)n基本概念n程序是指一个静态的指令序列;n进程为执行程序指令的线程而保留的一系列资源的集合;n线程是操作系统用来调度(diod)执行的最小单位。程序(chngx)进程线程第2页/共73页第二页,共74页。多线程技术多线程技术(jsh)n多线程n在运行一个多线程的程序时,为了运行所有的线程,操作系统为每个独立线程安排一些CPU时间,每个线程在使用完时间片后交出控制权,系统再将CPU时间片分配给下一个
2、线程。由于每个时间片足够短,这样就造成一种假象:好像这些(zhxi)线程在同时运行。n(a)从用户角度看多线程(b)从系统角度看多线程n应用多线程技术的目的就是尽可能地利用CPU时间。3第3页/共73页第三页,共74页。多线程技术多线程技术(jsh)n多处理器n多处理器是指在一台计算机中有两个以上的处理器,每个处理器可以同时执行不同(btn)的线程。n在多处理器的作用下,多个线程可以同时执行,从而以更少的时间完成更多的任务。4第4页/共73页第四页,共74页。多线程技术多线程技术(jsh)n线程调度n无论(wln)进程还是线程都是操作系统中进行CPU任务调度的程序单元;nCPU调度一个进程时必
3、定发生一个进程上下文切换;nCPU调度一个进程内的多个线程时则可以避免上下文切换的发生;n采用多线程可以减少因上下文切换导致的CPU时间开销。5第5页/共73页第五页,共74页。多线程技术多线程技术(jsh)n在多进程操作系统中,当创建一个进程时系统同时就为进程创建了一个主线程,由这个主线程生成额外的子线程,然后(rnhu)这些线程又可以生成更多的子线程,所有的线程共同构成了一个进程的线程集。6第6页/共73页第六页,共74页。多线程技术多线程技术(jsh)n线程优先级n线程被调度的先后顺序是依据线程的优先级来完成的;n当一个线程被创建时,操作系统将分配给线程一个优先级;n在调度周期的开始(k
4、ish),系统从线程的就绪队列中选择拥有最高优先级的线程来执行。7第7页/共73页第七页,共74页。多线程技术多线程技术(jsh)n影响线程调度的其它(qt)因素n线程调度除了依据线程优先级以外,还受系统调度策略和算法等因素的影响;n调度算法的优劣直接影响到CPU运行的效率和性能,不佳的调度算法不仅可能降低系统的反应时间,而且可能导致某些线程或进程长时间得不到调度;n目前操作系统一般采用抢占式调度。8第8页/共73页第八页,共74页。多线程技术多线程技术(jsh)n抢占式调度n抢占式调度是指当一个线程或进程所分配的时间片过期或有更高优先级的线程或进程出现时,如果调度进程还需要进行上下文的切换,
5、操作系统将暂停其在CPU上继续执行,调度另外(lnwi)的线程或进程到CPU上执行。n抢占式调度阻止了任何线程长期占用处理器的情况发生;n最短任务优先调度策略偏向于预估完成时间最短的线程,有利于迅速减少系统中线程数量,提高处理器的吞吐量。9第9页/共73页第九页,共74页。多线程技术多线程技术(jsh)n线程通信n如果线程间的通信发生在一个进程中,可以通过从堆栈片段传递值的方式来完成;n如果一个进程中的线程同另一个进程中的线程进行通信,则不能以线程通信的方式来处理(chl),而必须以进程间通信来对待,采取如环境变量、命名管道、共享内存等技术手段来解决;n在多数情况下,线程通信的代价要小于进程通
6、信的代价。10第10页/共73页第十页,共74页。多线程技术多线程技术(jsh)n线程同步n线程同步一般分为数据同步、设备同步和任务同步3种情况。n数据同步用于保证并发线程以一种安全的模式访问内存块;n设备同步用于多个线程访问单一设备时对实时操作和优先权的严格控制,阻止线程破坏设备的状态;n任务同步用于加强线程间逻辑关系上的前置条件和后置(huzh)条件。11第11页/共73页第十一页,共74页。多线程环境多线程环境(hunjng)n支持多线程模式的程序设计语言n用函数直接创建多线程:在VisualC+语言中,提供了封装在Win32API中的CreateThread、ExitThread等函数
7、方法的CWinThread类,为创建多线程应用程序提供了基本(jbn)框架;n从执行系统和数据流控制两个层次实现多线程程序设计:LabVIEW开发环境。12第12页/共73页第十二页,共74页。多线程环境多线程环境(hunjng)nLabVIEW执行系统n类似于Java虚拟机,是特有的中间执行平台。nLabVIEW程序框图编译生成的,并不是操作系统平台上的可执行程序代码,而是一种特有的程序组织代码,这种代码必须通过LabVIEW的执行系统来实现在操作系统上的运行;n在创建(chungjin)LabVIEW发布的可执行程序时,对于没有LabVIEW执行系统环境的计算机需要在发布组件选项中包含La
8、bVIEW运行引擎(Run-TimeEngine)。13第13页/共73页第十三页,共74页。多线程环境多线程环境(hunjng)n执行子系统(6个)n用户界面(userinterface)、标准(standard)、仪器I/O(instrumentI/O)、数据采集(dataacquisition)、其他1(other1)、其他2(other2)。nn在“文件(wnjin)VI属性执行”面板中可以对执行子系统进行更改。14注意:“与调用方相同”(same as caller)不是一个(y )子系统,它表示其执行子系统与调用该子VI的程序的执行子系统相同第14页/共73页第十四页,共74页。多
9、线程环境多线程环境(hunjng)n子系统分工n对执行系统进行细分的最初目的在于将不同用途的VI严格分配到不同的执行子系统中,各个执行子系统具体分工如下:n用户界面(ynhjimin)子系统:主要用于屏幕画图,以及键盘、鼠标输入等,这个子系统也用于特定类型的VI执行。n标准子系统:如果需要为用户界面(ynhjimin)保持专用运行时间,应当为VI指定这个子系统。n仪器I/O子系统:该子系统主要用于完成与VXI系统、GPIB系统、串行仪器或网络之间的通信。n数据采集子系统:该子系统主要用于数据采集。n其他子系统1:当程序中的任务需要自己的线程时使用。n其他子系统2:当程序中的任务需要自己的线程时
10、使用。15第15页/共73页第十五页,共74页。多线程环境多线程环境(hunjng)n用户界面子系统(xtng)n用户界面子系统(xtng)是LabVIEW系统(xtng)运行时必须加载的,而其他几个执行子系统(xtng)则是可选的;n用户界面子系统(xtng)实际上是一个单线程系统(xtng),只有一个用户界面线程执行各种任务;n在LabVIEW中所有与用户界面相关的操作都由用户界面子系统(xtng)负责,其他执行子系统(xtng)不负责管理用户界面。16第16页/共73页第十六页,共74页。多线程环境多线程环境(hunjng)n线程数量设置n无法通过编写程序来实现对LabVIEW执行系统中
11、线程变化的控制,但作为辅助工具,LabVIEW提供了一个线程配置程序,它位于LabVIEW安装目录中;n一般情况下,不需要修改LabVIEW系统环境的默认线程数量设置。当LabVIEW系统运行在一个专用计算机上,可以根据计算机的硬件配置情况适当增加线程的数量。而在一个非专用计算机上增加LabVIEW系统中线程的数量,则可能影响其他程序的运行,甚至可能由于线程过多导致(dozh)计算机整体性能的下降。17第17页/共73页第十七页,共74页。多线程环境多线程环境(hunjng)n线程配置(pizh)程序nn线程配置(pizh)程序界面线程配置(pizh)对话框18第18页/共73页第十八页,共7
12、4页。多线程环境多线程环境(hunjng)nVI优先级nLabVIEW程序优先级的设置方法可以分为程序控制和系统控制两种。n程序控制方法是指用户通过在程序框图中使用等待函数来控制程序内部并行任务的执行顺序;n系统控制方法是通过在VI属性中选择相应的VI执行优先级别(jbi)来控制VI的执行顺序。nn19任务(rn wu)1,优先级高任务2,优先级低第19页/共73页第十九页,共74页。多线程环境多线程环境(hunjng)n注意VI的优先级问题n考虑修改VI的优先级设置时要慎重小心,一般情况下,用户创建VI的默认为普通优先级,应尽量避免修改VI的优先级,只有那些特殊的VI才被指定(zhdng)为
13、非普通的优先级;n在当一个VI确有必要使用非普通的优先级时,应当遵循这条原则:不要让高优先级的VI持续运行;nVI优先级是隐含的,只能通过查询VI属性才能了解。20第20页/共73页第二十页,共74页。多线程环境多线程环境(hunjng)n子程序优先级n子程序优先级并不是一个真正的优先级,它并不标识VI的相对优先级别,仅用来标识一类特殊的LabVIEW程序,具有该优先级的VI不会被加入到执行子系统的运行队列中。n鲜明的特征(tzhng):VI的用户界面不能更新,只能调用子程序优先级的子VI,不能调试等;n子程序优先级的VI可以调用其他子程序优先级的VI,不能调用其他优先级的VI。21第21页/
14、共73页第二十一页,共74页。多线程环境多线程环境(hunjng)n子程序优先级n当选择了子程序优先级后,以下几个选项就不能选择了:n打开时运行(Runwhenopened);n调用时挂起(Suspendwhencalled);n运行时自动处理菜单(Autohandlingofmenusatlaunch);n允许调试(Allowdebugging);n调用时清除(qngch)显示控件(Clearindicatorswhencalled)。22第22页/共73页第二十二页,共74页。多线程环境多线程环境(hunjng)n子程序优先级VI示例n“字符串”选项板下的“删除(shnch)空白”(Tri
15、mWhitespace.vi)23第23页/共73页第二十三页,共74页。多线程环境多线程环境(hunjng)n多线程程序的优势n多线程技术在LabVIEW程序中充分发挥了重要的作用,具有以下几点优势:n更高效(oxio)地使用CPU;n更好的系统可靠性;n更优化的多处理器性能。24第24页/共73页第二十四页,共74页。多线程程序设计多线程程序设计(chnxshj)n线程优化n示例1:n要求:监控重物的速度变化过程,绘制S-t(距离(jl)时间)曲线、V-t(速度时间)曲线、V-S(速度距离(jl))曲线并显示所有数据。n初始程序分3步执行25第一帧:得到(d do)S-t数据第25页/共7
16、3页第二十五页,共74页。多线程程序设计多线程程序设计(chnxshj)n线程优化26第二帧:得到(d do)V-t数据第26页/共73页第二十六页,共74页。多线程程序设计多线程程序设计(chnxshj)n线程优化27第三帧:得到(d do)V-S数据第27页/共73页第二十七页,共74页。多线程程序设计多线程程序设计(chnxshj)n线程优化n发挥(fhu)多线程的优势,将程序优化为并行结构28并行结构(jigu)下的优化程序第28页/共73页第二十八页,共74页。多线程程序设计多线程程序设计(chnxshj)n线程优化n示例2:n以一个数据(shj)采集程序为例来介绍最大化数据(shj
17、)流的编程。n原程序由顺序结构实现29第1帧有两个执行流程:一是产生波形;二是配置模拟(mn)输入和输出。第29页/共73页第二十九页,共74页。多线程程序设计多线程程序设计(chnxshj)n线程优化30第2帧的功能是发送波形(b xn)数据。第30页/共73页第三十页,共74页。多线程程序设计多线程程序设计(chnxshj)n线程优化31第3帧的功能是采集(cij)波形。第31页/共73页第三十一页,共74页。多线程程序设计多线程程序设计(chnxshj)n线程优化32第4帧的功能是停止输入(shr)和输出的任务。第32页/共73页第三十二页,共74页。多线程程序设计多线程程序设计(chn
18、xshj)n线程优化线程优化后的程序框图33这个程序是按照配置、产生波形、读取波形的顺序执行(zhxng)的。只有等到前一步骤中错误簇的信息到达后,下一步骤才能执行(zhxng)。输入和输出配置VI函数采用并行结构,并使用合并错误函数来保证只有输入和输出都已经配置好之后才可以产生波形。第33页/共73页第三十三页,共74页。多线程程序设计多线程程序设计(chnxshj)n超线程程序n无论是超线程计算机还是多处理器计算机,都可以采用超线程机制对应用程序进行(jnxng)性能优化。n示例:计算所有大于2的质数。n初步想法34单循环解质数(zhsh)程序框图。第34页/共73页第三十四页,共74页。
19、多线程程序设计多线程程序设计(chnxshj)n超线程程序(chngx)n优化程序(chngx)35双循环解质数(zhsh)程序框图。第35页/共73页第三十五页,共74页。多线程程序设计多线程程序设计(chnxshj)n可重入技术n可以在“文件VI属性(shxng)执行”框中设置VI为可重入,在可重入VI中,每个调用都产生一个副本,有着独自的状态信息,这样在执行时,多个相同的子VI可以同时执行。n可重入执行在以下情况下是很有用的:nVI需要等待一个特定的时间或者超时后才执行;nVI中含有不能与其他实例共享的数据。36第36页/共73页第三十六页,共74页。多线程程序设计多线程程序设计(chn
20、xshj)n可重入技术n示例:设计(shj)一个仿真芯片74LS14n74LS14的功能图施密特非门的传输特性37第37页/共73页第三十七页,共74页。多线程程序设计多线程程序设计(chnxshj)n可重入技术n芯片74LS14是由6个施密特非门构成,因此同时需要调用(dioyng)6个子VI。38的程序框图。第38页/共73页第三十八页,共74页。多线程程序设计多线程程序设计(chnxshj)n可重入技术(jsh)39的程序框图。第39页/共73页第三十九页,共74页。线程通信线程通信(tngxn)与同步与同步n局部变量n局部变量(LocalVariable)是LabVIEW为改善图形化编
21、程灵活性而专门设计的特殊节点,主要是解决数据和对象在同一VI程序中的复用问题。n局部变量实际上是程序框图中已经(yjing)存在的某个对象的复制品。n需要某个对象既可读(读出当前值)又可写(写入更新值)时,就可以使用局部变量。40第40页/共73页第四十页,共74页。线程通信线程通信(tngxn)与同步与同步n创建局部变量:两种方式n第一种方式是在按照“函数编程结构局部变量”路径创建,此时局部变量的图标有一个问号,需要选择与之相关联的对象后方可使用;n第二种方式是选择目标对象的右键快捷菜单中的“创建局部变量”菜单项,放置到背面板的相应位置,这样(zhyng)就直接创建了该对象的局部变量。41第
22、41页/共73页第四十一页,共74页。线程通信线程通信(tngxn)与同步与同步n局部变量有两种状态:读状态和写状态n读状态相当于控制对象,外观和控制对象的端子相似,为宽边框;n写状态相当于显示对象,外观和显示对象相似,为细边框。n局部变量最常用于两种情况:并行循环控制和对变量数值的更新(gngxn)n并行循环控制主要用于用一个变量同时控制几个并行While循环的情况;n变量数值的更新(gngxn)是指在程序运行时,同一个对象既可作为输入给程序赋值,也可作为输出显示当前状态。42第42页/共73页第四十二页,共74页。线程通信线程通信(tngxn)与同步与同步n全局变量n如果要在几个VI间共享
23、数据,局部变量无法解决(jiju),需要使用全局变量(GlobalVariable)来实现;n全局变量的创建方法为:按照“函数编程结构全局变量”路径创建,在程序框图中会生成一个“?”端子,这表示该变量尚未定义,该端子上有一个地球图标,双击未定义的全局变量端子,或用右键快捷菜单中的“打开前面板”命令可打开一个全局变量前面板,它用于定义全局变量的内容。43第43页/共73页第四十三页,共74页。线程通信线程通信(tngxn)与同步与同步n全局变量应用示例:测速系统n全局变量前面板看上去和普通VI的前面板相似,但没有(miyu)背面板。工具栏中也没有(miyu)运行和调试的相关工具图标。44全局变量
24、前面板。第44页/共73页第四十四页,共74页。线程通信线程通信(tngxn)与同步与同步测距仪器初始化程序(chngx)45第45页/共73页第四十五页,共74页。线程通信线程通信(tngxn)与同步与同步测距仪器测试程序46第46页/共73页第四十六页,共74页。线程通信线程通信(tngxn)与同步与同步n事件发生n事件发生(Occurrence)技术可以用来在VI或部分(bfen)框图程序之间传递触发时间,利用事件发生技术可以避免轮询带来的系统资源浪费;n对于一般的应用来说,用户应从调用“产生事件发生”函数开始来创建事件发生参数值,该参数值必须要传递到所有其他事件操作中。然后,用户既可以
25、通过调用“等待事件发生”函数来发生,也可以通过设置事件功能来创建一个事件的发生。在LabVIEW环境中,可以有多重的“等待事件发生”函数节点存在,然后当与之联系的设置事件功能被调用时,所有的事件都会在同一时间触发。47第47页/共73页第四十七页,共74页。线程通信线程通信(tngxn)与同步与同步n事件(shjin)发生示例n事件(shjin)发生测试程序前面板48第48页/共73页第四十八页,共74页。线程通信线程通信(tngxn)与同步与同步事件(shjin)发生的测试程序框图49第49页/共73页第四十九页,共74页。线程通信线程通信(tngxn)与同步与同步事件(shjin)发生用户
26、子VI的程序框图50第50页/共73页第五十页,共74页。线程通信线程通信(tngxn)与同步与同步n通知n通知(Notification)技术通常用于两个相互独立的框图程序之间或同一台计算机中两个不同VI之间的同步通信;n通知器(Notifier)是基于通知技术的通信工具,可以看做数据之间的邮箱,一部分框图程序向邮箱中发送数据,另一部分框图程序从这个邮箱中收取数据;n对于通知器,在没有通知消息发生时,程序框图处于等待状态,避免了无休止地循环检测,从而减少了计算机时间的浪费(lngfi);n通知技术不能用于网络或VIServers之间的通信。51第51页/共73页第五十一页,共74页。线程通信
27、线程通信(tngxn)与同步与同步n通知流程(lichng)n从调用“获取通知器引用”(ObtainNotifier)函数来开始创建通知参数值,使用该函数时必须输入元素的数据类型;n通过“发送通知”(SendNotifier)发送信息;n接收方通过“等待通知”(WaitonNotifier)得到发送的信息。52第52页/共73页第五十二页,共74页。线程通信线程通信(tngxn)与同步与同步n通知(tngzh)器示例nNotification测试程序前面板53第53页/共73页第五十三页,共74页。线程通信线程通信(tngxn)与同步与同步通知(tngzh)测试程序框图54第54页/共73页第
28、五十四页,共74页。线程通信线程通信(tngxn)与同步与同步通知(tngzh)用户子VI的程序框图55第55页/共73页第五十五页,共74页。线程通信线程通信(tngxn)与同步与同步n通知的优缺点n通知和事件(shjin)发生有些类似,不需要使用轮询技术,减少了系统开销;n通知相比事件(shjin)发生机制有一定的优势:事件(shjin)发生不能传递数据,只能触发事件(shjin),而通知不仅可以传递数据,还可以通过“取消通知”函数删除信息;n通知也有一些不足:没有数据队列,有时会丢失一些事件(shjin),因为新的事件(shjin)会覆盖旧的没有响应的事件(shjin)。56第56页/共
29、73页第五十六页,共74页。线程通信线程通信(tngxn)与同步与同步n队列n队列(Queue)结构是一种先进先出(FIFO)的结构;n用队列技术,可以将一个有序的消息(或数据)从一个程序中传递到另一个与之相独立的并行运行的程序中;n队列技术把数据发送到一个队列缓存中,如果没有程序将这些数据读出,这些数据将一直保存在队列缓存中,直到有一个程序将其读出并删除;n如果有两个应用程序都在等待同一个队列中的同一条数据,只有那个动作快的程序会收到数据,动作慢的则不会(bhu)收到预期的数据,因为这条数据已经被动作快的程序读出并删除了。57第57页/共73页第五十七页,共74页。线程通信线程通信(tngx
30、n)与同步与同步n队列的应用(yngyng)示例nQueue测试程序前面板58第58页/共73页第五十八页,共74页。线程通信线程通信(tngxn)与同步与同步队列(duli)测试程序框图59第59页/共73页第五十九页,共74页。线程通信线程通信(tngxn)与同步与同步队列(duli)用户子VI的程序框图60第60页/共73页第六十页,共74页。线程通信线程通信(tngxn)与同步与同步n信号量n信号量(Semaphore)技术可以用于限制同时访问一个被保护的共享资源的任务数目;n通过一个公用的信号量,可以在某一时刻仅允许(ynx)一个任务执行一个受保护的临界区代码;n信号量和其他同步机制
31、是不同的,其他机制主要是唤醒一个等待任务,信号量则是告诉任务需要等待其他任务允许(ynx)其执行时才执行,所以能够有效地保护公有资源。61第61页/共73页第六十一页,共74页。线程通信线程通信(tngxn)与同步与同步n信号量的应用(yngyng)示例n信号量测试程序前面板62第62页/共73页第六十二页,共74页。线程通信线程通信(tngxn)与同步与同步信号量测试(csh)程序框图63第63页/共73页第六十三页,共74页。线程通信线程通信(tngxn)与同步与同步信号量用户(yngh)子VI的程序框图64第64页/共73页第六十四页,共74页。线程通信线程通信(tngxn)与同步与同步
32、n集合点n集合点(Rendezvous)技术可以使若干并行的任务同步执行;n只有所有的任务到达后,才开始同步执行,就好比一个会议,只有等到参会(cnhu)人员到齐后才开始。65第65页/共73页第六十五页,共74页。线程通信线程通信(tngxn)与同步与同步n集合点的应用(yngyng)示例n集合点测试程序前面板66第66页/共73页第六十六页,共74页。67线程通信线程通信(tngxn)与同步与同步集合点测试(csh)程序框图第67页/共73页第六十七页,共74页。线程通信线程通信(tngxn)与同步与同步集合点用户(yngh)子VI的程序框图68第68页/共73页第六十八页,共74页。提示
33、提示(tsh)与建议与建议多线程应用程序有很多优势,如提高执行效率、获取更多有效CPU使用时间等,在LabVIEW中,写多线程程序及配置线程的优先级是相当容易的。在有些情况下,使用多线程反而会降低执行效率,在以下情况中应该避免使用多线程:应用程序的运行步骤有先后顺序;应用程序有过多的线程切换;高优先级的线程导致其他线程饥饿;在系统中只有有限的资源可以利用;过多使用没有安全保护(boh)线程的CIN和DLL;大部分任务都访问用户界面线程;死锁线程需要共享数据。69第69页/共73页第六十九页,共74页。习题习题(xt)简述局部变量、全局变量、事件(shjin)发生、通知、队列、信号量及集合点之间
34、的异同点。在一个VI中有两个While循环,如何实现只用一个Stop控件控制While循环的停止?如下图所示。考虑使用局部变量、全局变量、队列、通知等方法。70第70页/共73页第七十页,共74页。习题习题(xt)在一个VI中,含有一个While循环,循环中有一个子VI,子VI也是一个While循环,如何使用(shyng)一个Stop控件使主VI和子VI同时停止?如下图所示。考虑使用(shyng)全局变量、队列、通知等方法,另外是否可以使用(shyng)局部变量来实现,为什么?(a)主程序(b)子程序71第71页/共73页第七十一页,共74页。习题习题(xt)打开(dki)和运行习题中第3章目
35、录下或者LabVIEWExample中的,前面板如图所示。(1)为什么第2部分的WhitePlot会报错?(2)如果将这个子VI设置为不可重入,将会出现什么问题?(3)在程序中队列所起的作用是什么?72第72页/共73页第七十二页,共74页。感谢您的观看(gunkn)!第73页/共73页第七十三页,共74页。内容(nirng)总结1。当选择了子程序优先级后,以下几个选项就不能选择了:。“字符串”选项板下的“删除空白(kngbi)”(Trim Whitespace.vi)。只有等到前一步骤中错误簇的信息到达后,下一步骤才能执行。无论是超线程计算机还是多处理器计算机,都可以采用超线程机制对应用程序进行性能优化。芯片74LS14是由6个施密特非门构成,因此同时需要调用6个子VI。局部变量有两种状态:读状态和写状态。感谢您的观看第七十四页,共74页。