




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、亥岸ff与RWC+ Builder下的多线程编程王 峰(电子第54研究所 石家庄050081)摘要 介绍了使用C+十Builder实现多线程编程的方法,包括了线程的定义、执行和同步。着重介绍了多线程之间的同步协调问题。关键词 C+Builder 线程 同步1 概述Inprise公司的新一代 RAD开发工具 C+十Builder,可以方便地实现多线程的编灌。C+Builder通过VCL提供了一些用于简化编写多线程应用程序的对象,如 TThread对象。从而使得编写多线程应用程序变得非常容易。应用程序中使用多线程可以从以下途径来增强程序的功能:.避免瓶颈。若进程只有一个线程,那么有时程序可能会必须
2、停止其它所有的动作以等待某一费时的线程的执行。在该线程完成前,CPU始终是空闲的。使用多线程,应用程序就能在某一个线程等待费时进程的结果时,继续执行其它独立的线程。.组织程序。通常可以将线程的行为组织为几个功能独立的并行进程。使用线程可同步执行每个并行进程中的单段代码。使用线程还可指定多个程序任务的优先级,以便把更多 CPU时间分配给更重要的任务。#pragmapackage(smart_init)/一一一一一一一一一一一一一一一一一一一一一_fastcalMyThread:MyThread(boolCreateSuspended):TIhread(CreateSuspended)!Prior
3、ity=tpldle;/指定线程优先级FreeOnTerminate = true; /线程结束后自动释放|VJ_fastcalMyThread:Execute()U|O/一一一一 Placethreadcodehere一一一一这样线程的基本框架已经完成,我们只要在线程的Execute)函数中添加任务代码,TMyThread对象就可以使用了。上面代码中除黑体字代码外,均为自动产生的代码。.初始化线程为了保证线程稳定可靠的运行,需要使用线程构造函数初始化线程类,指定线程的优先级和何时释放线程。优先级是指当操作系统在所有线程中分配CPU时间段时,指示线程可得到多少。要指定线2 线程的定义.线程的创
4、建要在应用程序中使用线程对象,必须创建TThread的一个新的派生类。为创建 TThread的一个派生类,可从主菜单中选择 FileINew。在新对象对话框中,选择ThreadObject。系统会提示为新线程对象提供类名。在提供名字之后,C十+Builder创建一个新的.cpp和头文件以实现线程。假如我们的线程对象起名为MyThread,则当前工程中将自动增加建一个名为TMyThread的TThread子类和一个名为Unit2.cpp的单元,这就是我们创建的TMyThread子类的原码,如下:#include #pragmahdrstop#includeUnit2.h程的优先级,可设置Prio
5、rity属性。Priority属性值有7个选择,如附表所示。附表线程优先级的定义属性值优先级Tpldle线程只在系统空闲时运行。Windows不会中断其它线程来执行带有tpldle优先级的线程。TpLowest程序优先级比标准低两个点。TpLower程序优先级比标准低一个点。TpNormal程序有标准优先级。TpHigher程序优先级比标准高一个点。TpHighest程序优先级比标准高两个点。TpTimerCritical程序得到最高的优先级。2002年布 28卷常 2期夕己线电 3甩佑 技木淤岸liff汽 irt当线程完成其操作,就可简单地被释放。最方便地就是让线程对象释放其本身。为此,应将
6、FreeOnTerminate属性设为true。参见上面代码的构造函数中的黑体代码行。.编写线程函数Execute方法就是线程函数。编写线程函数必须确认没有覆盖应用程序其它线程所使用的内存。另一方面,因为线程与其它线程共享相同的进程空间,可使用共享内存在线程之间通信。3 线程的协调当编写线程执行时运行的代码时,必须考虑到可能同步执行的其它线程的行为。要避免多个线程同时使用相同的全局对象或变量。另外,一个线程的执行可能依赖其它线程执行的结果。了.1 逻旁厚对厉4为避免在访问全局对象或变量时与其它线程冲突,可能需要暂停其它线程的执行,直到该线程代码完成操作。我们主要介绍多线程共享数据的几种方法。锁
7、定对象一些对象内置了锁定能力以防止其它线程使用该对象的实例。例如,画布对象(TCanvas及其派生类)有一种Lock方法可防止其它线程访问画布,直到调用 Un-Lock方法。VCL还包含一种线程安全的列表对象1TreadList。调用 TThreadList:LockList返回列表对象,同时阻止其它线程使用列表直到调用 UnlockList方法。调用 TCanvas:Lock或 TThreadList:LockUst可以安全地嵌套。锁定直到最后一个锁定调用匹配到同一线程时才会被释放。使用重要区段多线程中在访问共同的公共数据块时,必须对公共数据块进行保护。同时只允许一个线程对它的访问。这可以通
8、过重要区段(CriticalSection)的使用来实现,C+Builder中,给我们提供了一个 TCriti-calSection对象来进行重要区段的划定。该对象有两个方法,Acquire)和Release()。它设定的临界区域可以保证一次只有一个线程对该区域进行访问。如下例所示:pLockXY一Acquire();tr y|Y=sin(x);_finalypLockXY一Release);上例中有一个重要区段 LockXY,可阻止访问全局变量x和y。任何使用x和y的线程必须调用重要区段。通过异常捕获可以保证在发生异常时可以释放重要区段,而允许其它线程访问全局变量 x和y。需要强调的是,重要
9、区段只在每个线程都使用它们来访问关联的全局内存时才有用。忽略重要区段并且不调用Acquire而访问全局内存,会引起同时访问的问题。使用多重读、独占写的同步器当需要访问的是一个经常读但很少写的对象或变量时,可以使用TMultiReadExclusiveWriteSynchro-nizer保护它。这个对象与重要区段类似,但它允许多个线程同时读,只要没有线程写即可。使用主VCL线程C+Builder编程是建立在 VCL类库的基础上的。在程序中经常需要访问 VCL对象的属性和方法。不幸的是,VCL类库并不保证其中对象的属性和方法是线程访问安全的(Thread-safe),访问 VCL对象的属性或调用其
10、方法可能会访问到不被别的线程所保护的内存区域而产生错误。因此,Thread对象提供了一个Synchronize方法,当需要在线程中访问VCL对象属性或调用方法时,通过Synchronize方法来访问属性或调用方法就能避免冲突,使各个线程之间协调而不会产生意外的错误。如下所示:void_fastcalTMyThread:PushTheButon(void)Butonl一Click();void_fastcalTMyThread:Execute()Synchronize(TThreadMethod)PushTheButon);对Butonl一Click)方法的调用就是通过Syn-chronize(
11、)方法来实现的,它可以自动避免发生多线程访问冲突。在 C+Builder中,虽然有一些 VCL对象也是线程访问安全的(如 TFont,Teen,TBrush等),可以不用Sychronize()方法对它们的属性方法进行访问调用以提高程序性能,但是,对于更多的无(下转第40页)RADIO COMMUNICATIONS TECHNOLOGYVol.28 No.22002理位置不同而有所差异;环境因素。不同的气侯环境,将直接影响所测信号的C/TRB值;参考基准。参考地球站 G/T值及天线增益值的准确性、可靠性; 噪声测量的随机性; 人为因素。待测站和参考站应调试到最佳状态。针对上述原因,采取如下措施
12、:异地同时测试,限地域选择测试参考站可有效减少地域因素、环境因素误差。地域范围以EIRPSB值、气候条件相同为准;同地同时测试是最佳选择方案,可消除时间因素、地域因素、环境因素引人的测试误差;同地不同时测试,无测试系统差异引人的误差,时间因素的测试误差,可通过多次测试,取其均方值;采用频谱仪的AVG功能键,设置 N,100次,是减小噪声测试误差的有效方法;制定科学、严谨的测试规范,提供准确、可靠的参考站 G/T值及天线增益数据;选择信标无调制时进行测试。这样可有效地减少测试误差。5 结束语本文所述的卫星信标比较法已第一次应用于天线增益及 G/T值的测试,结果令人满意,测试方法得到众专家的认可。
13、参 考 文 献1 WilburL.Pritchard,HenriG.Suyderhoud,Robert A.Nel-son.SateliteCommunicationSystemsEnginering(SecondEdi-tion)2 吕洪生等主编 .实用卫星通信工程 .成都:电子科技大学出版社,1994.10踌令玲仓玲令玲f玲C1x玲导玲仓玲令玲E特E玲E玲令特令玲令玲导玲仑特导玲导玲E玲E玲Ee玲令玲仑玲份玲令减令玲令玲份月令特仓玲C*C4片令玲令玲令玲守特令玲仑玲守玲C对令玲e玲C玲令玲令玲C玲令玲令玲份(上接第30页)TMyThreadMyProcess= newTMyThread(f
14、alse);法确定的VCL对象,还是强烈建议使用Synchronize()方需要注意的是不要在应用程序中创建太多的线法确保程序的可靠性。程,过多的线程反而会降低整体效率。3.2 多窦窟I,17)1何步5 工程应用若线程必须等到另一线程完成某项任务,可让线程暂时中断执行。然后,或者等待另一线程完全执行结束,或者等待另一线程通知完成了该项任务。等待线程执行结束可以使用 WaitFor方法等待另一线程的结束。WaitFor直到那个线程终止才返回,终止的方式要么完成了其 Execute方法,要么由于一个异常。等待任务完成当只需等待一些操作完成而不是等待线程结束时,可以使用事件对象(TEvent),该变
15、量必须全局可见。假如A线程完成某些操作后,B线程才能执行,可以在A线程完成完成这些操作后,调用 TEventSetEvent,通知B线程操作完成。B线程检测到后,要调用 TEvent:ResetEvent关掉信号。4 线程的执行线程的执行由Execute方法实现。在程序中,首先创建线程类的实例,要创建一个立即开始运行的线程实例,将构造函数的CreateSuspended参数设为false即可。例如,下列代码创建一个线程并开始运行 :在国家某重点工程中,笔者负责开发接收分系统的监控软件。要求同时监控几十个检测控制点,同时和 12个串行口通信,其中有的串口实时性要求较高,数据量较大。采用传统的编程一方法存在通信数据丢失、查询刷新时间长、命令响应慢等问题。为解决这些问题,采用了多线程技术,通讯口的读写、监控点查询和画面刷新均采用了独立的线程完成,监控效率大为提高,命令响应和数据采集间隔时间缩短
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 人员闭环运输管理办法
- 保密软件采购管理办法
- 临时用工考核管理办法
- 仓库耗材库存管理办法
- 人群种草事件管理办法
- 企业员工着装管理办法
- 会计业务稽核管理办法
- 企业废料物资管理办法
- 主食副食加工管理办法
- 丰县项目实施管理办法
- 曲靖市罗平县人民医院招聘考试真题2024
- 战术搜索教学课件
- 2025年福建厦门港务控股集团有限公司招聘考试笔试试题(含答案)
- 2025年陕西省行政执法资格考试模拟卷及答案(题型)
- 2025年长三角湖州产业招聘笔试备考题库(带答案详解)
- 2025包头辅警考试真题
- 2025至2030中国高端英语培训行业市场发展分析及发展趋势与投资机会报告
- 地质灾害治理工程施工安全管理制度
- 2025年茶艺师职业技能鉴定考试试卷(含答案)
- 中央党校师资管理制度
- 公司电子发票管理制度
评论
0/150
提交评论