说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

使用Delphi 4.0编写多线程

HTML文档下载 WORD文档下载 PDF文档下载
使用Delphi 4.0编写多线程

1.介绍

VCL提供几个对象以方便编写多线程应用。使用多线程可以避开一些性能的瓶颈。使用不同优先权的线程可以给重要的任务更多的CPU时间。在多处理器机器上,使用多个线程并将不同的线程放在不同的处理器上运行,将会提高应用的性能。当有相应的底层硬件时,NT操作系统支持真正的多线程,而即使底层硬件支持多处理器,95也只能模拟多线程的运行。

2.定义线程对象

对于大多数应用,可以使用线程对象来表示一个执行的线程。线程对象封装线程必需的应用,简化了多线程的编写。

注意:多线程对象并不允许泥控制线程的安全属性或栈的大小。如果需要控制这些,必须使用BeginThread函数。即使使用BeginThread,仍然能从一些线程同步的对象和在定位相差的方法中获取好处。

为了在应用中使用线程对象,首先必须产生一个TThread的继承对象。在file|new菜单中选择Thread Object创建。

新产生的Thread Object 包括一个框架代码,以下是一个名为TMyThread的线程:

unit Unit2;

interface

uses

Classes;

type

TMyThread = class(TThread)

private

{ Private declarations }

protected

procedure Execute; override;

end;

implementation

{ TMyThread }

procedure TMyThread.Execute;

begin

{ Place thread code here }

end;

end.

在自动产生的unit文件中,你应该:

l (可选)初始化线程

l 填写Execute方法,编写线程函数

l (可选)编写清除代码

3.初始化线程

如果你要为线程编写初始化代码,必须重载Create方法。在线程的声明中加入一个新的构造函数,并在它的实现中编写初始化代码。在这里你能够为线程设置一个缺省的优先级和当它执行完毕时,是否应该自动的释放。

3.1 设置一个缺省的优先级

优先级分为7级,如下表所示:

TpIdle The thread executes only when the system is idle. Windows won't

interrupt other threads to execute a thread with tpIdle priority.

TpLowest The thread's priority is two points below normal.

TpLower The thread's priority is one point below normal.

TpNormal The thread has normal priority.

TpHigher The thread's priority is one point above normal.

TpHighest The thread's priority is two points above normal.

TpTimeCritical The thread gets highest priority.

警告:一味地提高对CPU敏感的操作的线程的优先级会饿死其它线程。应该提高那些经常等待外部事件的线程的优先级。以下的代码表示一个低优先级的执行后台任务的线程,它在其它的时间内不会打扰应用的执行。

constructor TMyThread.Create(CreateSuspended: Boolean);

{

inheritedCreate(CreateSuspended);

Priority := tpIdle;

}

3.2 指明线程的释放

一般情况下,线程只会被执行一次,在这种情况下,特别方便让线程释放它自身,只要简单的将FreeOnTerminate特性置为true。如果需要多次运行,或同一个线程的多个实例,你可以缓存线程以提高性能,这时,将FreeOnTerminate特性置为false。

4.编写Execute方法

Execute方法是线程的函数。泥可以将它想象成一个由你的应用启动的程序,只是它共享了同样的进程空间。写线程函数稍微要注意一点是要确信没有写其他进程使用的内存,另外,你优可以使用共享内存在不同的线程之间通信,因为它们是在同一个进程空间中。

4.1 使用主VCL线程

当你使用从VCL继承过来的对象,他们的特性和方法并不能保证是线程安全的,即,访问特性货方法也许会执行一些使用一些没有被其他线程保护的内存。因此,为VCL对象的访问设了一个主VCL线程。这是处理应用程序中组件接收的所有的Windows消息的线程。 如果所有对象是在同一个线程中访问特性和方法,就不必担心会发生冲突。为了使用主VCL线程,产生一个分离的过程来执行需求的操作,在你的线程中使用Synchronize方法来调用这个分离的过程。如:

procedureTMyThread.PushTheButton;

begin

Button1.Click;

end;

procedure TMyThread.Execute;

begin

....

Synchronize(PushTheButton);

....

end;

Synchronize等待主VCL线程进入消息循环,然后执行相应的方法数据访问组件和图形组件都是线程安全的,不需要使用主VCL线程。

4.2 Thread-local变量

Thread-local变量是一种线程内的全局的变量,但是并不与其他的线程实例共享。声明thread-local变量是在threadvar区中声明,如:

threadvar

x : integer;

threadvar区只适用于全局变量。

5. 编写清除代码(Clean-up Code)

线程结束时执行的清除代码可以集中起来。当线程关闭前,一个OnTerminate事件发生。将清除代码都放在OnTerminate事件的处理代码中,这样,这些代码就总会被执行。

OnTerminate事件处理并不是作为线程的一部分运行,它是在主VCL线程环境(Context)下运行。有两个含义:在OnTerminate事件处理中不能使用任何线程局部变量可以安全的访问任何组件和VCL对象,而不必担心会与其它的线程冲突

6.避免同时访问

为了避免与其他线程在访问一个全局对象货变量时发生冲突,需要在执行线程代码时锁定其他线程的执行,直至完成操作。VCL支持三种技术来达到这个目的:

(1) 锁定对象:有些对象自己有锁定的功能,如canvas

(2) 使用critical区

如果对象没有提高内置的锁定功能,需要使用critical区,Critical区在同一个时间只也许一个线程进入。为了使用Critical区,产生一个TCriticalSection全局的实例。TcriticalSection有两个方法,Acquire(阻止其他线程执行该区域)和Release(取消阻止)

每个Critical区是与你想要保护的全局内存相关联。每个访问全局内存的线程必须首先使用Acquire来保证没有其他线程使用它。完成以后,线程调用Release方法,让其他线程也可以通过调用Acquire来使用这块全局内存。

警告:Critical区只有在所有的线程都使用它来访问全局内存,如果有线程直接调用内存,而不通过Acquire,会造成同时访问的问题。例如:LockXY是一个全局的Critical区变量。任何一个访问全局X

Y的变量的线程,在访问前,都必须使用Acquire

LockXY.Acquire; { lock out other threads }

try

Y := sin(X);

finally

LockXY.Release;

end;

(3) 使用multi-read exclusive-write synchronizer

当你使用critical区保护全局内存时,同一个时间内只允许一个线程使用这块内存。这也许会超过你的要求,特别是对于那些经常读而很少写的对象或变量。在多线程内,当没有线程对同样的内存进行写操作时,同时读它是没有任何问题。当你有一些全局变量需要经常读而很少写时,可以使用TmultiReadExclusiveWriteSynchronizer保护它们。这个对象象Critical section

但是当内存没有线程在写它时,允许多个线程读取一个内存。

为了使用multi-read exclusive-write synchronizer,产生一个全局的 TmultiReadExclusiveWriteSynchronizer实例,与你想要保护的内存相关联。每个线程如果项读取该内存,必须先调用BeginRead方法。它确信没有其他的线程在写内存。读完后,调用EndRead。写内存时,调用BeginWrite,写完后,调用 EndWrite。

警告:同Critical section一样,multi-read exclusive-write synchronizer也只有在所有的线程都使用它访问同一块全局内存时才有效。直接访问该内存将会导致同时访问问题。

7.线程对象的执行

使用线程时,首先产生一个线程的实例,可以立刻开始运行线程,也可以开始把它置于挂起(Suspended)状态,以后使用Resume方法运行它。将构造函数中的CreateSuspended参数置为false,线程将创建后立刻运行,如:SecondProcess := TMyThread.Create(false); {create and run the thread }一般在单处理器的机器上,一个进程适合产生16个线程,如果线程都在运行,那么线程的数目要更少一些。

暂停线程:调用suspend

恢复线程:调用resume

终止线程:调用Terminate,它将线程的Terminated特性置为true。如果Execute编写合理,它将周期性检查Terminated,当Terminated为True时,将终止线程的执行。如:

procedure TMyThread.Execute;

begin

while not Terminated do

PerformSomeTask;

end;

缓存线程

当应用需要同一个线程的多个实例(多次运行一个线程),可以缓存线程,以后重用,以提高性能,而不是每次创建一个新的线程。为了缓存线程,使用一个线程列表来维护线程。

威胁百度:奇虎360确认将与谷歌达成合作关系 Facebook更新Messenger应用 推免费网络电话服务 网上疯传iOS7概念设计:Dashboard是真是假? 过时的UI设计 Ubuntu手机系统前途不被看好 三星将于今年发布Tizen设备 将对苹果形成威胁? 分享9条经典的编程语录 国际著名黑客大赛介绍与比较 微软Azure CDN服务全球范围内出现宕机 双向多功能U盘:从Android设备到PC还有多远? 证明了自己:微软Win8获美国防部6.17亿订单 2013 Facebook黑客杯报名即将开始 解决Win8下IE10无法打开的故障 [简讯] Scala 2.10.0发布! 收购传闻:Apple一厢情愿还是Waze待价而沽 回顾过去,展望2013:移动开发引擎、工具和语言盘点 成本为0!Netflix开源工具Janitor Monkey清理AWS iOS开发者讲述在Google工作的三个月 GitHub历史上最糟糕宕机事故回放及反省 疑因竞争 谷歌有意让地图与WP手机不兼容 移动游戏开者必看:海外VC最关心什么? 淘宝UED:随侃设计师的个人素养 TIOBE 2013年1月:不负重望 Objective-C再次赢得桂冠! 大数据:商业或技术的挑战? 开源移动统计:Cobub Razor近期版本大升级 无人机应用,为何屡遭苹果拒绝 2013年Java继续火的五大理由 Rails所有版本都有SQL注入漏洞?其实没那么严重 如何设置Windows Server 2012 NTFS权限 智能手机大局已定 HTC难扭转乾坤? 比谷歌手表更酷!基于大数据分析的睡衣 众投资金:改变了移动游戏开发的一切一切 请教一个SQL的问题 从局域网内拷贝文件,总是断线 问大家一个特别傻的问题,但是请务必帮我解答,谢谢了 问大家一个特别傻的问题,但是请务必帮我解答,谢谢了 treeView控件的问题 asp中的几个问题,急! 在类中用static const 定义常量的问题 谁安装oracle9i了? 哪里有文档编辑软件的源程序(带查找、替换),给url就给分? =最近做了一个免费小工具,想请大家帮忙测试并发表一些关于我的程序功能和界面布局的意见= 很急 [建议]关于提问 100分请教如何使用JS来实现定时执行alert()命令 请问怎样给DataGrid添加一个空行? 请问在用openssl生成csr时出现如下的问题,如何解决?急用 100感谢 =最近做了一个免费小工具,想请大家帮忙测试并发表一些关于我的程序功能和界面布局的意见= oracle 9i的问题,急救 24位的位图是不是没有颜色表? 一个简单的关于层的问题,谁能帮我解释一下呢? 请问在用openssl生成csr时出现如下的问题,如何解决?急用 100感谢 超菜问题? 现在网上有没有破解的MDaemon下载? 唉,和老妈吵架~散分~~ LyfUpload组件上传时能否添加下拉框,并把其值一起提交到数据库中?急!急!急! 请高手一览:为什么这段程序不能写进数据库?不好意思,分只有这么多了!呵呵 建立一个收费的网站的思路如何?请大家指教! 怎样改造Anythere 5.0的数据库? 有没有去过珠海的朋友? 我出100分重新讨论《100分求助:如何解决内存泄漏,代码如下》 有没有现成的软件,判断一个email的使用方的具体位置,到“市”一级? 用ADO能不能用SQL语句将Access2000库中的表复制到SQL2000server库中? maddam、Hankuu请进,重新给分。100分求助:如何解决内存泄漏,代码如下(无内容) javascript中如何控制<input type="image" id=id1 name=name1>的位置 如何用pb完成文件上传服务器的功能 有关ORACLE在ODBC内部的连接问题?? 经典砍价术 十个系男生的初夜 菜鸟没分了,还是慷慨散100分求助!(Up 有分) 求救,图像和文本一起上传 网络安全问题的一点疑问,欢迎大家来讨论,分数不够可以再加!!! Gnome桌面显示不出来? 请问VC和BCB哪个更好? Rational材料 怎样入手SQL 紧急求救:系统不能正常关机 在installer安装程序中如何创建程序组快捷方式 IE非法出错 一篇妓女写的文章,(转帖)作者不详 javascript中如何得到当前时间(yy-mm-dd hh:mm:ss.mmm) 新手问路:请教Bean与一般的java class 的区别 linux怎样才能支持3D鼠标? 日本从中国进口煤炭,然后倒入大海,是怎么回事? Coffee isn't a healthy drink.Coffee id _____ _____drink.(同义句)What do you think of the film?(同义句)He___ ___ ___ ___ the film?He went to the hospital in a hurry(同义句)He ___ ___the hospital.My mother gave me a dictionary as my bi 金属缠绕垫检验标准 向1L0.5mol·L—1的NaOH溶液分别加入稀醋酸、浓硫酸、稀硝酸,则恰好完全反应时的热效应△H1、△H2、△H3的关系正确的是A.△H1>△H2>△H3 B.△H1<△H3<△H2C.△H2>△H1>△H3 D.△H1>△H3 “这场比赛被人们誉为是‘强强对话'.这句话有语病,应改为······ 金属缠绕垫规格型号前加HW是什么意思 硫酸和氢氧化钠要纳入危险化学品重大危险源辨识吗?他们的临界值是多少? 为什么日本人在海底储存煤炭和矿石,他们的目的是什么 反-4-叔丁基环己烷甲酸的结构式 地球上什么是可生资源 NaOH溶液分别与①醋酸②浓硫酸③稀硝酸恰好反应放除热量分别为Q1,Q2,Q3 比较Q1.Q2.Q3的大小.答案上写Q1<Q3<Q2就是不知道为什么, 金属缠绕垫用的gd0529是什么意思?具体是什么? 手表怎么换电池 为什么煤可一沉入海底保存 金属缠绕垫中的(金属缠绕垫DN200)是什么意思? 不重合的两个平面最多有几条公共直线? 大气层的温度是否都随离地面高度的增加而降低? would you like tea ____ coffee?I don't like tea _____ coffee1.and...and2.or.and3.and..or4.or.or 平面α∩平面β=α,平面α∩平面γ=b,平面γ∩平面β=c,且abc不重合平面α∩平面β=α,平面α∩平面γ=b,平面γ∩平面β=c,且abc不重合,求证a,b,c,交于一点或两两平行.请写出具体的证明步骤,麻烦您了. 大气圈温度随高度增加而递减.这句话怎么错了=_= 怎么才能增加豆腐的韧性?我想增加豆腐的产量,可是产量上去了豆腐就太嫩,根本来不起来. 不知道如何解决.请个位大侠帮忙想想有什么办法. 谢谢! 地球上很多矿物资源是不可再生的 对 还是错 食物热量与燃烧时间有无关系玻为什么?匾抒赔是不是欠 现今英国与印度之间的关系 关于露天煤矿的“二量”是什么,起到什么作用.知道是指开拓和回采.但“二量”的作用是? 为什么燃烧的时候会放出能量? 英国和印度的关系 只有一个地球 " 矿物资源"说明了什么?从哪个词语看出?地球所拥有的自然资源也是有限的.拿矿物资源来说,它不是上帝的恩赐,而是经过几百万年,甚至几亿年的地质变化才形成的.要从这句话 中国是怎么选举主席和总理的? 烟囱林立的英国工业,印度民族大起义,英国宪章运动的关系 地球除了矿产还给我们提供了哪些资源 测量五要素是什么? 英国在印度的殖民对印度的影响 掘进面和回采面可以用压入和抽出两种不同的通风方式么 中国美国韩国法国泰国日本英国西班牙巴西属于哪个洲 河姆渡人和半坡人有什么异同?要用自己的话说,不能完全抄课本中的.好的我会采纳. 花岗岩为何是侵入岩?这其中的侵入怎么解释? 西双版纳州是否有人出售橡胶树? 醋酸和氢氧化钙反应CH3COOH + Ca(OH)2生成什么? 花岗岩变质后成为什么岩?我想知道谢谢 用两节南孚5号怎么让普通发光二极管发光 氢氧化钙和氧化钙反应25℃是在澄清石灰水中加入少量氧化钙,恢复到25℃时该溶液的溶质、溶质的质量分数如何变化? 看来,提高人们的环保意识,在今天显得更加至关重要了.怎么改 西双版纳的橡胶树在每年的几月份收割? 关于地球起源的传说地球的传说,最好是把人类的产生也说一下, 在同一平面内,不重合的三条直线的公共点个数可能有【 】 二极管的脚是什么金属谢谢你的回答 2012的传说哪些是真,哪些是假啊,比如说地球板块重新排序组合.不是寂寞,是最近单位那帮人总没事研究,听着像真的似,今天飞机有事明天火山有事后天泥石流地震,闹庭。 空间三条不重合的直线a,b,c能确定的平面个数是?A,0,1或2 B,0,2或3 C,1,2或3 D,0,1,2,或3 请问,听说西双版纳有橡胶树承包,是不是真的能赚?听朋友说在景洪西双版纳承包橡胶树有点赚,想问下是不是真的?现在去能不能承包到?了解这行的人能不能提供些具体情况说明, 人类真的是在地球上进化而来的吗?为什么会有那么多关于人类起源的传说? 向等体积0.1mol/L NaOH溶液分别加入①稀醋酸②浓硫酸③稀硝酸 ,至恰好完全反应,求焓变大小关系?我想知道为什么? 三脚红蓝双发光二极管引脚长度不同,这些引脚分别代表什么 地球上有美人鱼吗?如果有,是什么样子的?很纯净、很漂亮吗?有她的传说吗?突然很好奇?还有关于美人鱼的传说! 日本把矿产和煤储存在海底,到底是怎样储存的?如果不是储存在海底,那要储存在哪里? 西双版纳橡胶树的越冬条件和水分条件 关于2012的传说:这个2012是不是地球上三分之二的人都会死去啊? 醋酸,稀硝酸,浓硫酸与等浓度的烧碱溶液反应至完全中和,放出的热量分别为A B C,为什么A大于B大于C?谢(纠正一下这里的ABC均为绝对值 那么A小于B小于C) I don't like coffee in the slightest.(改为同义句) 请帮忙该一个病句:这场比赛被人们誉为是“强强对话”.
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘