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

使用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;

缓存线程

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

孙小群:将SAP HANA打造为开放的PaaS平台 GitHub推出重大改进:强调速度、内容和交互性 如何打造测试工程师精英团队? 如何做个有“钱”途的测试工程师? 苹果开始关注企业移动化 iOS 7的10大办公功能 “开源群英会2013” 参会名单(持续更新中) 微软Builder2013前瞻 主打跨平台工具及服务 CMDN 29期:软件测试与管理之路 微软IE10与HIT FM 携手打造全新HTML5官网 专访GenMyModel CTO:一款全新在线建模工具背后的故事 【直击美国云计算】Jason Hoffman:数据和计算的融合将破坏全球利润 【直击美国云计算】如何做Hadoop、流处理框架等技术的采用选择 【直击美国云计算】细数云技术领域成王败寇:从SaaS到SDN 【直击美国云计算】谷歌Jeff Dean:成功的关键是专注 致远V5发布:强调大协同,企业移动化真来了 Mailbox:六星期实现从零到百万用户及日处理亿条消息 代码审查,也要天时地利人和 Clash of Clans产品总监:游戏中的商品定价一开始就要高 移动互联网最核心的竞争是:设计的竞争 【直击美国云计算】面对AWS,VMware不会畏缩 美国白宫任命Twitter法务总监Nicole Wong为副CTO Keek宣布推出首款视频Update API 专访阿里前端工程师:淘宝移动Web开发那些事儿 【直击美国云计算】为什么eBay用燃料电池来驱动他的犹他州数据中心 【直击美国云计算】6周发布新产品,LinkedIn的trunk-based开发 移动周报:疯狂吐槽还是更得欢心?细数iOS 7的是与非 国内最受欢迎的开源项目集锦 开始3D编程前需注意的十件事 [CTO俱乐部第100期]软件平台的新思维及2345技术团队管理经验分享 失败怪圈:今天的移动App在重蹈1999年的覆辙 极客编程必备的五大PHP开发应用 谁有比较快的新闻组服务器的地址? 如何找到各种系统图标?(VC) 姐姐的信(也是以前的) 请问,谁手里有PERL的表单提交程序?(不要能让访问者看的见的) vivianchou@eyou.com 我所遇见的招聘题。。。555 怎么回事~? 参天无眼!!我所遇见的招聘题呀,你。。。55555555555 哪位知道象windows优化大师那样的平面按钮控件。 c+vc+vb+java+delphi+>>>>=工作? 怎么得分呀? dos下的Tcp/Ip协议应用 白痴,笨蛋,神经病之差异(转贴) 测试(大家都不许进来,只是测试,注意,只是测试) 请大家说一下哪个代理注册的网站收费比较底,而且服务又比较好的,谢谢! 在asp中如何实现记录集与编辑框、table表等的数据绑定,给个思路也行。着急呀 [-------大虾帮忙啊--------] bcb中缺少的帮助文件能否再添加? 在哪里可以找到关于sybase的资料 哪位仁兄知道如何打包delphi开发的sybase客户程序,最高78分奉送 一个关于OnDraw()的重绘问题,急急急急急急急! 新手的问题! dll调问题???VB调用VC++的DLL需要返回值时,DLL如何定义?VB调用函数如何定义??? 各位大虾 谁能提供视频采集卡的原代码,必须要CB的,300分 在堆(heap)上与在栈(stack)上建立的对象有什么区别? 一个问题,在做元件时怎样建立TdateTimePicker 给大家看看我弟弟给我的信 求助,标题栏为“The police are investigating the robbery-"的是什么程序? 谁能将.CPP文件的代码翻译成DELPHI语言?? 有关于FLASH5.0的问题!!!请各位大吓指点! 一个问题,怎样在PC:PageControl上增加TabSheet1,TabSheet1,TabSheet1…. 标题栏为“The police are investigating the robbery-"的是什么程序? 一个弱弱的问题 一个问题,建立的 FB: TBevel没显示,好象根本没建立一样。 如何在 MDI CLIENT 中添加快捷方式??谢谢!! 55分,如何映射控件中子控件的消息? 如何选择书 关于文献数据库的一个问题-如何把一个字段和一个文件关联起来? 所有喜欢到水园来逛逛,但是从不回帖子或很少回帖子的人进来签到~~~~ 谁来救救我呀,我好惨呀。。。。 如何通过VC编程,随时关闭网络端口 诚寻对嵌入式linux感兴趣的网友 今天临走前,再灌一桶酒! 急!!!哪里可以下载到制作工具栏时用到的位图呀? 太原的在哪能买到程序员杂志 我的qq:10120129 谁找我??? xml 高手帮帮我,为什么我下面的文件,在IE5.0中什么也没有?? 请问高手:在uml类图中如何用关系表示一个实体类和一个接口间的关系。 Cathy进来~~ 请问高手们一个Delphi的一个应该是比较底层的东西。 mimi大酒店正式開業﹗先進來的有分啊﹗ 3,2,3,7,18,( ) 括号填什么? 全世界北纬18度的度假胜地有哪些. 1、 找出不同的数2 3 5 8 12 16 23 302 4 8 12 16 32 不同在哪里啊?2、 643 111 421269 ( ) 4917 4 68 4 86 5 ()回答得都不错,只是第二题的第一小题,大家没有说清楚! 2 2 0 7 9 9 ()括号里的数是18,请问是怎么得到的, 想知道:中国 北纬18度,经度78.24度 在哪 1,2,5,( ) 东经110度北纬35度是哪里 北纬18度在那个地方? 7 8 14 16 21 24什么32 东经140度50分,北纬35度44分一个小说里写得 请问北纬18度有哪些国家的哪些城市?尽量多点,请问北纬18度有哪些国家的哪些城市?尽量多点,能提供点非洲的城市吗? 三年级找规律(8,6).(24,2).(16,3).(12,) 某地位于北纬35度,东经163度,该地位于( )A.高纬度地区 B.中纬度地区 C.热带地区 D.低纬度地区上题中该地可能处在( )①东半球 ②西半球 ③南半球 ④北半球A.①③ B.②④ C.②③ D.①④ 想知道: 北纬44度 东经4度 在哪 小学奥数网--------找规律:1/2,7/2,10,20,()(),49,98 A点东经120度,北纬44度,所在时区是( )区,B点东经90度,北纬35度,所在时区是( )区 北纬20度,东京5度,在北纬40度,东经166度,什么方向 1、2、3、4、5、12、( )、( ) 现在基本知道可能是奇数项分一组,偶数项分一组。前面1、3、5、7…为一组规律, 东经118度12分~119度36分,北纬32度43分~34度06分适合种植人参吗? 在北纬30度,东经5度;北纬20度,东经110度.哪个是既在东半球,又在西半球?在北纬30度,东经5度;北纬20度,东经110度。哪个是既在东半球,又在北半球? 一道小学奥数找规律题1 2 3 7 11 16 () 29 想知道:中国 北纬24度,东经118度 在哪 东经160度北纬55度左右是什么地方 东经115度北纬48度是哪. 4()16.()填啥数儿 北纬32度20分 东经119度45在哪个地方 北纬34.5度东经43.58度具体位置 给出依次排列的一列数,-1,2,-4,8,-16,32,-64..这列数的第2009个数是多少 24度03分北纬118度16分东经在哪里? 北纬39度55分451秒东经116度23分504秒 这是我国那个城市的什么部位. 依次排列的一列数:-1 ,2,-4,8,-16,32,...按照规律,第n个数为? 东经114度北纬32度是哪里 北纬39度54分20秒,东经116度25分29秒在哪个半球,东南西北 给出依次排列的一列数2、4、8、16、32,……,1)按照依次给出的几个数的排列规律,继续写出后面的3个数;2)这个数的第2014项是几?第n项呢? 北纬27度是一条奇怪的线吗? 北纬39度55点451秒东经116度23点504秒很具体的说是什么地方.什么北京南三环赵公口与草桥之间老师说这样还太大,最具体的是什么地方? 给出依次排列的一列数:-1,2,-4,8,-16,32,…①写出32后面的三项数②按照规律,第n个数为 北纬27度在哪?我知道在哪了!在贵阳,是产烟草的。 例如:北京在北纬39度,东经116度;合肥在北纬32度,东经117度.算出该地点与我们的距离急 算式! 有一列数,按一定规律排成1、-2、4、-8、16、-32、……设其中 某三个相邻的数的和是-384,求这三个数各 东经113度北纬27度是什么国家 北纬21.37度,东经110.1度是什么地方 有一列数,按一定的规律排列成:-2,4,-8,16,...,其中某三个相邻的数的和为-384,求这三个数各为多少. 东经117度北纬27度是什么山脉 东经110度 北纬35度在什么地方东经110度 北纬35度是什么地方? 有一列数,按一定规律排列成:-1,2,-4,8,-16,32,-64…,其中有三个相邻的和为1224,这种说法对吗?请说明理由 找规律(3.8.18.33.53__,__)快!,为什么?i am primary student 东经109度 北纬35度是啥平原很确定吗 东经110北纬25是什么地方关于地理方面的 5×9+15÷3-2=18使等式成立(加括号) 东经121°北纬38°是什么地方 东经100度北纬100度是什么地方 加括号使等式成立3.6+2.4*3+1.5/2=18.75 北纬42东经38.76是什么地方 东经96,北纬17是什么地方 18÷2×3+6=1 加括号,使等式成立! 东经122北纬38是哪里 西经157度 北纬21度在什么地方 2,2,7,18,31,90,(),括号里应该填?a.57 b.69 c.86 d.79 北纬50.38° 东经30.49°什么地方 东经20北纬60是什么地方/内海、湖泊啊
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn