CVI对多线程的支持(1)概念篇
【 原帖地址:http://easons.blogbus.com/logs/2006/04/2366573.html】
多线程对于windows应用程序来说,并不是什么先进的技术,打开你的任务管理器,选择“进程”分页,点击菜单的在“查看”->选择列,在“线程计数”前打勾,确定后你在“进程”分页里头看到现在在运行的绝大多数程序都基于2个以上的线程。
那么进程线程的概念以及他们之间的关系又是什么呢?
线程技术是指开发架构将应用程序的一部分分离为“线程”,使线程与程序其余部分执行步骤不一致。线程是一种特殊的对象,是操作系统执行多任务的一部分,它允许应用程序的一部分独立于其他对象而单独运行,因此也就脱离了应用程序的常规执行顺序。
目前主流的Windows系统都是基于多任务机制,即可同时运行多个应用程序(“应用程序”这个词并不恰当,恰当的说法是“进程”)。当启动应用程序时,系统就会为该应用程序分配所需的内存以及其他资源。内存和资源的物理分离叫做进程。换言之,进程是应用程序的一个运行实例,当然,应用程序可以启动多个进程。每个进程至少有一个基本线程(主线程)。线程与数据一起隔离在某一物理区域,在进程中声明的数据可通过该线程进行访问。
Windows操作系统为抢占式多任务运行机制,即采用时间片轮换的方式来执行多任务,时间片轮换的基本对象是线程。操作系统为每一个线程分配时间片,让该线程在这个时间段内运行,之后中断该线程的运行,启动另外的线程执行。多线程技术的优势在于将进程分解,在主线程外产生一个或几个辅助线程,用于完成如数据采集、网络访问、数据存储等后台工作。
CVI对多线程的支持(2)基本原理
【原帖地址:http://easons.blogbus.com/logs/2006/05/2518754.html】
在典型的LabWindws/CVI多线程程序中,使用下线程创建、显示并运行用户界面,在次线程中,运行其它的对时间要求很高的操作[3]。LabWindows/CVI提供了两种设计辅助线程的机制,分别为线程池(thread pools)和异步定时器(asynchronous timers),线程池适用于需要不连续地执行多次或在循环中执行的任务,而异步定时器适用于在固定时间间隔内执行的任务(只支持一个辅助线程),若要使用多个辅助线程,只能采用线程池技术。
多线程的创建
线程池机制中辅助线程的创建是通过调用实用库(Utility Library)的CmtScheduleThreadPoolFunction Adv函数,把想要在次线程中运行的函数名传递给它,线程池调用这个函数在它的其中一个线程中运行。根据线程池的设置和当前状态,线程池创建一个新的辅助线程,使用一个已经存在的空闲线程,或等待一个活动的线程空闲来执行需要调度的函数。
多线程间的数据安全
数据保护是在使用辅助线程时必须要解决的关键问题,防止多个线程同时操作某一变量,导致逻辑错误,是多线程协调运行的重要内容。在CVI中,系统提供了线程锁(blocked)、线程安全变量(thread safe variables)和线程安全队列(thread safe queues)三种机制来保护共享数据,实现线程间安全的数据传输。其中线程安全队列保护机制传输数据量大;且读取数据和写数据互不影响;数据传输基于事件模式,可以注册读取数据和写数据回调函数在队列数据达到指定数量才被调用。基于多线程监控程序的典型应用为:辅助线程采集处理大量数据并传递给主线程进行显示,线程安全队列机制是最佳的选择。
写入线程把要传送给读出线程的数据打包后写入到数据队列中,数据队列采用先进先出的工作模式,每写入一个数据包,系统调用在读出线程指定的回调函数来处理数据。选择合适的队列长度后,即使读出线程没有完成上一个数据包的读出,写入线程依然可以安全的写入下一个数据,对数据队列可以同时进行读写操作,线程间的数据传输是安全可靠的。
监视控制辅助线程
监视控制辅助线程的运行,是多线程协调运行的另一个关键问题,CVI提供了CmtGetThreadPoolFunc- tionAttribute函数来监视辅助线程的状态。在多通道、定时数据采集的监控软件中,多个辅助线程定时处理某项任务,直到主线程通知其停止。
CVI提供的异步定时器机制可以方便的实现以上功能,但异步定时器机制只能创建一个辅助线程。结合线程池机制和定时器控件成为可行的选择之一。CVI在创建面板的线程中调用该面板控件的回调函数,即要在辅助线程中运行某一定时器控件的回调函数,则该定时器控件所在的面板必须在辅助线程中创建。这样,主线程就可以通过开关该定时器来控制辅助线程开始或停止某项任务,实现多个辅助线程定时处理某项任务,且每个线程定时可以不同。
[glow=255,red,2]近期会写一个简单的例程序发到我的博客上,欢迎一起来讨论http://easons.blogbus.com[/glow]
[此贴子已经被作者于2006-5-24 21:29:54编辑过]
|