Windows
- 格式:pdf
- 大小:133.48 KB
- 文档页数:3
兵工自动化 2002年第21卷第4期 软件技市 Software Techn ique O.I.Automation 2002.Vo1.21.NO.4 文章编号:1006一I576(2002)04—0044—03
Windows并行开发及其在实时监测系统中的应用
陈国华,夏季 (西南科技大学制造科学与工程学院,四川绵阳621002) 摘要:在介绍Windows系统的多任务特点及进程和线程的概念的基础上,讨论了线程的启动、结束、 同步和通信的问题及其相关编程方法。并以轴向力实时检测分析系统为例,说明并行开发技术在实时系统中 的应用。通过并行设计,充分利用Win32操作系统的多任务特点,将不同的任务分布到各个线程中,使各 个任务同步进行,互不影响,提高了系统的效率。同时,给出了采集模块中部分代码的程序示例。 关键词:Windows;并行开发;进程;线程;实时监测系统 中图分类号:TP311.11 文献标识码:A Parallel Development on Windows and Its Application in Real—time Supervision and Testing System CHE,N Gno.hUa,XIA Ji (Dept.of Manufacturing Science and Engineering,Southwest University of Science and Technology,Mianyang 621002,China) Abstract:The characteristics of muIti—task of Windows,and the concept of process and thread were introduced,the begin,end,synchronism and communication of thread and it’S correlative programming method were discussed in this paper.Taking a Real—time SUpervision and testing system of axial force as sampie,the application of paraIlel development technology in Real—time system was demonstrated.According to parallel development,the muIti—task character of Win32 Operation System is made fuII use and different tasks were distributed to threads.and then that aII tasks were run in synchronization and did not affect each other,thUS,the efficiency of system was improved.At the same time,a part of program codes in acquisition modUle were given out. Key Words:Windows;Parallel development;Process;Thread;Real—time supervision and testing system
1 引言 Windows操作系统主要特点之一是支持多 任务。如一个文字编辑系统,在前台进行文字编 辑工作的同时,后台还可以进行打印,文字校正 等工作,这些都是通过多任务来实现的。对用户 来讲,各个程序是同时运行的,而对于只有一个 处理器的计算机来讲,是操作系统在进程或线程 之问的快速切换分配时问片来达到这个目的。 进程是应用程序的可执行实例。每个进程都 有自己独立的内存地址空问,应用程序使用的动 态库(DLL)也将它们的代码和数据装入进程的 地址空间。 线程是在进程中的一条执行路径。一个进程 可以有几条线程,所有的线程共享创建它们的进 程的内存空问。在线程的生命期内,一个线程具 有3种基本状态:执行、阻塞(等待)、就绪。 对于单CPU的系统,正在运行的线程占用CPU, 并且是激活的。一个阻塞的线程等待另一个线程 来唤醒,一个就绪的线程当其时问片分配到时立 即被调度运行。所以,在单CPU系统中,微观 上任一时刻只有一个线程处于运行状态,CPU 为处于就绪状态的线程按一定规则分配时问片。 当一个处于执行状态的线程时问片用完,操作系 统调用下一个线程由就绪状态转为执行状态。 2线程的管理 2.1线程的启动 Microsoft基本类库(MFC)提供支持多线 程应用程序。在MFC应用程序,所有的线程用 CWinThread对象代表。在大多数情况,不必明 显地创建这些对象,可以通过调用框架函数(API 函数)AfxBeginTh read来启动线程。函数 收稿日期:200卜0卜27;修回日期:2002-02—27 作者简介:陈国华(1974一).男,河南人,1997年毕业于沈阳工业学院,现西南科技大学在读硕士研究生,从事机电系统控制与 CAD研究。 ・44・
维普资讯 http://www.cqvip.com 兵工自动化 2002年第2l卷第4期 软I韵支市 Software Technique o.I.AUtOmarion 2o02.V0I.21.No.4 AfxBeginThread启动新线程并返回一个线程对 象指针,通过回调函数来执行线程中要完成的任 务。注意:如果在线程中正在使用MFC对象, 就必须用CWinThread对象来创建线程。不用 CWinThread对象创建线程就不可能正确的初始 化MFC需要的内部变量来处理多线程。 2.2线程的终止 终止线程有2种方法,一种方法是等待线 程函数执行完毕后自动退出。线程退出后创建的 线程对象是否被删除取决于CWinThread的一 个成员变量m bAutoDelete。m bAutoDelete为 TRUE时,线程对象在线程结束后自动删除 CWinThread对象。为FALSE时,线程结束后 CWinThread对象并不删除,需要外部来删除。 另一种终止线程的方法是调用API函数 AfxEndThread。 Win32提供了API函数GetExitCodeThread 来检查线程是否结束。函数GetExitCodeThread 的第2个参数返回线程的退出码,可以通过检 查退出码来判断线程是否结束。但为了能够得 到正确的退出码,需要在创建线程时将 m bAutoDelete设置成FALSE。这样线程结 束后CWinThread对象仍然存在,保证 GetExitCodeThread能正确运行。 2.3线程的同步 当多个线程访问同一个共享资源时,用户应 用程序就会面临可能产生的资源冲突。通过线程 的同步化,就能够限制同时访问资源的最多线程 数目,保证程序的正确执行。Win32提供了多种 线程同步的方法,包括: ①互斥量(Mutex) 用来限制一个资源一次只能有一个线程访 问,可以在进程问共享。常用到的API函数有: CreateMutex创建一个互斥量,WaitFor SingleObject等待一个互斥量,ReleaseMutex 释放互斥量。 ②信号量(Semaphore) 用来限制访问一个共享资源的线程数,即对 于一些共享资源,可以有多个线程进行访问,但 访问的线程数目不能大于一定的数目。使用信号 量一般要3个API函数:CreateSemaphore用 来创建信号量,waitForSingleobject等待一个 信号量,ReleaseSemaphore释放信号量。 ③临界区(Critical Section) 这种方法建立的对象可以防止多个线程同时 访问共享资源,但这种对象不能在多个进程中共 享。使用临界区一般要两个API函数:用 InitializeCriticalSection函数来初始化临界区, 用DeleteCriticalSection来删除临界区。 ④事件(Event) 可用于封锁对一个资源的访问,直到出现了 某些线程或进程的信号,即指定一个指定事件的 信号。使用事件同步一般有4个API函数:用 CreateEvent创建事件,WaitForSingleObject 等待事件的发生,SetEvent标记一个事件的发 生,ResetEvent用来清除时问发生的标记。 以上几种同步方法各有特点,在使用时可根 据自己的需要来使用。 2.4线程问通信 除了共享资源外,线程问还有一些其它的信 息需要相互交换。线程间的通信一般有3种: ①全局变量 任何线程都可以直接访问进程中的全局变 量,因此可以通过全局变量实现线程问通信。对 全局变量的访问方式和在主线程中访问全局变量 相同。 ②指针方式 如果一个线程能获得另一个线程中的某个对 象或变量的指针,可通过此指针直接访问数据或 调用其它线程的成员函数。这种方法一般通过工 作线程控制函数的参数传递。 ③消息响应 线程以事件方式向主线程发送消息,让主线 程对事件进行处理,有两个要求:接收消息的线 程必须有窗口对象;发送详细的线程必需事先知 道接受窗口的句柄或窗口对象指针。但通过消息 响应方式能够传送的信息量有限,仅能在 wParam和IParam参数中传递。 3轴向力实时监测、分析系统 3.1系统功能简介 轴向力实时监测、分析系统是根据某研究机 构的需要设计,包括数据采集、在线监测、实时 分析3部分内容。根据用户要求,需要完成以下 一些主要功能: ①信号采集功能。主要完成几个通道信号 (包括轴向力、温度和转速)的实时采集。采样 频率可调; ②屏幕显示功能。以曲线和数字方式分别 显示修正后的各通道数据,趋势曲线以及分析后 的数据和谱线; ・ 45 ・
维普资讯 http://www.cqvip.com 兵工自动化 2002年第2l卷第4期 软I韵互 Software Technique o.I.Automation 2002.Vo1.21.No.4 ③数据存储和回放功能。完成采集数据和 分析数据的存储和回放: ④分析功能。信号分离,并进行数据的时 域和频域分析; ⑤修正功能。通过对输入标定数据的分段 拟合,进行数据修正; ⑥监控功能。对采入的数据进行在线监视, 报警和控制。 3.2系统的并行设计 由于系统的数据采集的实时性要求比较高, 屏幕显示和数据分析和监控需要在线进行,且各 个功能所要完成的任务要占用不同的时间长度, 因此,若系统顺序完成几个任务就会增加系统负 担,降低系统的效率。尤其是当采样频率较高时, 会因为在同一周期内无法完成这些任务而导致系 统锁死。而通过并行设计,充分利用Win32操 作系统的多任务特点,将不同的任务分布到各个 线程中,使各个任务同步进行,互不影响,就有 效的解决这些问题,提高了系统的效率。 在此系统中,主线程负责创建用户界面、接 收消息等工作。另外,由于Win32系统是抢先 式系统,为了保证数据的采集不被其他线程中 断,就要开辟一个优先级较高的线程来采集数 据。同时,为保证系统硬件相关部分和硬件不相 关部分的相互独立,将采集模块做成动态链接 库,采集到的数据存入内存池中,然后调用动态 链接库中的相应函数定时获取内存池中的数据。 数据的分析、存储和在线监控由于耗时较多,且 各个任务所占用的时间段不同,故将其分别置于 不同的线程中,在数据采集的同时进行数据的分 析、存储和各通道的巡回监视。各个线程中所要 完成的工作并行进行,线程间的通信可以通过消 息响应函数PostMessage来实现。 ::WaitForSingleObject (m—pWinThread一>m—hThread, INFINITE); delete m——pWinThread; ) m—pWinThread AfxBeginThread (//启动线程 SampleProc,//采集线程回调函数 NULL. THREAD PRIoRITY ABoVE NoRMAL.0. CREATE—SUSPENDED,//启动时将线程挂起 O); m—pWinThread一>m—bAutoDelete=FALSE; m—pWinThread一>ResumeThread0; //恢复线程 return TRUE: eIse return FALSE; ); 回调函数中的代码实现如下: void SampleProc() { WoRD m tempValue; while(blsSampling) { m—pWinThread一>SuspendThread(); //当采集一次后,暂时挂起线程 //等待其它线程唤醒 m—tempValue=GetSampIeData(); //采集数据 WaitForSingleObject(hMutex,INFINITE); //如果正在采集,就等待 DataArray【numI m—tempValue; num++: ReleaseMutex(hMutex); //采集完毕,释放互斥量 if(num> MAX—NUM) num=O: ) AfxEndThread(一1); }; 3.3采集模块中部分代码示例4 结论 在采集前进行线程前的初始化工作,对各采 集通道的参数进行设置。 BOOL InitSample(WORD ch—No) { ………一//通道中参数的初始化 hMutex=CreateMutex (NULL,FALSE,NULL);//创建互斥量 if(m—pWinThread) //检查线程启动前是否上一个启动 //的程仍在运行,如果是,等待原来 //的线程执行完后再启动该线程 { m—pWinThread一>ResumeThread0; ・ 46 ・ 充分利用Win32操作系统的多任务特性, 通过并行设计,可完成多个任务的同步进行,实 现各个任务的协调运作,提高系统的效率。且能 有效地解决各模块顺序运行时,当一定时间段无 法完成任务发生冲突的问题。 参考文献: 【1l David J Kruglinski,Scot Wingo,George Shepheerd. Visual c++6.0技术内幕(第五版)【M1.北京:北 京希望电子出版社.1997.254—261. 【2l张德福.并行处理技术【M1.南京:南京大学出版社, l992.