您的当前位置:首页正文

多线程安全问题

2022-02-05 来源:好走旅游网
维普资讯 http://www.cqvip.com

( Delphi VCL皓 日囹囡目目回圆 ) 安徽大学 胡学联 protected 多线程程序设计对于多效Windows 程至少拥有一个执行线程,这个线程被称 用户和程序员来说,是一个新的技木.因 作主线程);其它线程要使用这些VCL构 此在Windows 95以前的Windo ̄并不支 nr0ceduIe Ex ̄ute:override; procedure DisLoop; 件,必须使用Sncyhronize方法,通过传递 持线程的概念(Windows NT除外)。当 使用了VCL构件的方法,就可以避免多线 public Windows提供了对线程的支持时,将线程 程对全程VCL构件的冲突(svnehronize从 和Delphi语言联系起来时又会提出这样 c0n乩rucl0r C reatefEdit:TEdit:Max:lnte— 主线程内调用你指定的方法+使得你能自 ger); cad; 的问题:在Delphi中进行多线程编程时, 由地使用VCL构件的特性和调用VCL构  要使用哪些VCL构件,这是安全的吗?换 件的方法)。impl ̄emation 言之,DelDhi VCL多线程是安全的吗? 回答这个问题似乎不是一件容易的 2 VCL的线程安全性 svnchronized方法允许使用全程VCL {MyThreadI c0口st工I】cInT M n eBd Create(Edit:TEdit:M丑x: Integer), be n 事。有人说,DelIphi VCL实际上是多线程安 构件以及调用这些构件的方法。如果我们 全的,有的人则意见相反。为了理解这个 的应用程序中加进了多线程,那我们一定 问题,为了我们能够在多线程应用程序设 要能安全地访问所有VCL构件并且调用 计中放心地使用VCL,我们有必要深人剖 它们的方法。这时,我们唯一要做的工作 析一下Delphi中的线程类Tth ̄sd。 是将一个定制的方法(使用了VCL构件的 方法)传递给Synchronize。因此.我们可以 inhefiled Ca'care(False) AEdh:=Edit; MaxLoop:=M日x: FroeOnTerminmte:=True end; 1 线程类Tthread 线程类Tthmnd使得可以在Delphi应 说VCL不是多线程安全的(亦即.你不能 用程序中实现多线程执行。Tthread类是 同步地访问在两个线程的Execute方法中  我们只是有一种办法确保 Tobject类的直接派生类。与其它大多数 的VCL构件)DelpIIi类和构件不同的是,不能在程序中 我们用一种多线程安全的方式使用VCL, 直接使用该对象.而必须从Tthread类产生 即传递一个定制的方法给 nchronize过 一proced ̄e MyThread.DisLcop be n AEdit text:=lattoStr(Cu ̄vtLoop) end; 个新的派生类,并对需要使用的方法进 程,从那里使用全程VCL构件。 结论是:VCL本身不可能是线程安全 使用它1 p ̄edure MyThre ̄.J ̄.ecute; var 行重写,以重载(override)Tthread类的方 S-jncb2onize(同步/镇定)。 1,1 Execute方法 I:Integer; be n 法 两个重要的方法是Execute(执行)和 的+但我们能够用一种线程安全的方式来 I:=0toMaxLoop do be n CurrentLoop:=l: 3 实例一则 创建两个执行5 000次循环的线程。 Execute是这样一种方法,其中包含 了线程要执行的代码,亦即.它实现线程 每个线程在执行循环的每次叠代后,将显 的功能;因此,你肯定要在派生的线程类 示循环的次数。本程序中用户通过单击 中重写该方法。在语义上,Ex ̄ute方法返 Synchronize(DisLoop); if Terrainated then Exit; end; end; end 8tlLtt按钮来开始两个线程的执行。当运行 回时,线程执行终止,释放线程堆栈,并涌 程序时,便发现这两个线程是并发执行 用OnTerminate事件驱动程序(如果有的 的。程序代码如下: 话)。K- ̄e*ute方法必须周期性地检测Ter- minated特性.如果为Irae,Execute方法必 须立即返回。如果线程返回失败+表明调 wit ThreadUnJl; interlace USe 注意,这里DisLoop方法使用了VCL 构件TEdit.因此绝不能由该线程直接调用 它;而是将它传递给synchronize方法,通 过Synchronize来调用DisLoop方法,从而 避免了多线程冲突 用Terminate方法时,线程未能终止。 1.2 S chro 方法 Classes、SldClds,SysUtils; type synchronize过程有一个TthreadMet— ’ My'fhr ̄ut=elass(Ttht ̄ead) private 4结束语 在使用Delphi作多线程程序设计时,不 hod类型的参致,该参数是一个不带参数 的方法,用于指定在线程对象中的方法。 在Delphi多线程编程中.各种VCL构件都 是临界资源.只能由主线程使用(一个进 AEd Lt:TEdit; Mexl ̄op:Integer; Cu ̄ntLoop:integer; 可避免的要经常使用VCL构件,只要能蜉对 多个线程同步使用的构件给出如上讨论正确 自辱使用方法 

因篇幅问题不能全部显示,请点此查看更多更全内容