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

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

缓存线程

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

VB数据库记录查询四法 vb应用程序访问sql server方法探讨 VB中超长OLE数据库字段的操纵方法 VB中将数据转换为数据库文件 VB中远程数据库的访问 Visual Basic 的数据库编程 Visual Basic数据库数据的选项录入及选项增减与编辑 把资料输往Excel来列印-VB资料 报表中的滚动问题-VB资料 编写Connect Strings-VB资料 表或查询是否存在-VB资料 不创建DSN直接在程序中使用ODBC数据源-VB资料 不用 DATA 控件操作数据库文件 -VB资料 不用 EOF 以加快记录循环-VB资料 处理Select语句中的单引号 -VB资料 断开所有的数据连接 -VB资料 访问VB外来数据库 非access数据库在vb中的编程及应用 关闭程序中所有创建的数据库连接。 -VB资料 关闭所有的数据连接 -VB资料 关于数据报表的打印设置-VB资料 VB建立、改变及重构Access数据库-VB资料 结构化查询语言(SQL)详解之一-VB资料 利用VB使ACCESS数据库在网络使用中保持同步 返回 连接Data到多个表单-VB资料 列出 SQL Server 数据库中所有的存储过程-VB资料 列出MDB档当中所有table的名称-VB资料 您想知道有谁正在使用您的 Access 文件吗?(多人环境中)-VB资料 主题:浅谈Excel 的VB编程 巧用VB6的DataGrid实现通用电子表格 VB取得正确的 RecordCount 值 ~散分哦~,哈~ 可怜的准初级程序员(水平的没过,竟然拿了个资历格的) 各位兄弟请了!一个远程接入问题邀请教各位~! 这个问题好象不难 如何在WIN NT4中安装、使用IIS4????? no pains,no gains. work for the beautiful girl here and for our beautiful life 各位大侠: 我是新手,有人能给我讲讲xmlspy吗?? win.ini与SYSTEM.INI的区别? Oracle 的产品真的很烂吗?参与者都有分! 现需开发一套对多个数据库(不是一个数据库中的多个表)进行操作的程序,使用BDE,请大家提建议 CPen的问题! 各位请教:我要通过电话线做多路远程接入但我不想用路由器 请问,使用ado控件的程序,考到其他机器上,除了数据库和应用程序之外,还需要拷贝什么文件? 部分技术超过OFFICE 国产软件挑战微软 关于子窗口 请教:uninstall onflow.exe和wcmdmgr.exe是什么软件? DataSet如何定位记录. lius_lzc(小刘)你好。请来这 高程成绩 不是高手不要进来!!!!!!!!!!!!! 那位大侠能说一下快手的原理啊,有源码最好???????????????? 各位有什么网站可在线看片或下载东西,网速要非常快,如果有请与大家分享,如果没有请勿进,免得大家试半天的网址,谢谢合作 实模式和保护模式的区别? 一个只问小湖的问题 ASP 中的 Response.End 在JSP中怎么写??? 有关多媒体数据库的问题 笨鱼笨鱼,好象你的故事大家都知道了,贴张相片出来给大家看看,大家说好不好啊?? 请教关于第三方控件的问题,谢谢 软件工程师们,你们开发软件的时候听什么音乐呀? 各位大侠,请帮助一下初学者 CPen的问题!!!!!!! 我在泡脚呢,给大家发分,打听一下你们泡脚的时候都干什么? 关于新的论坛数据的提问 在Delphi如何存取SQLServer DataBase表里的图像记录?(100分) 怎样循环更改窗口图标? 请问,那位能帮忙给个Email地址和url地址的正则表达式。急用,在下不胜感谢! 各位网络高手请进! 关于服务端用自己(socket)的程序,客户端用IE,怎样把客户端的数据信息传给服务端? 共享锁,排他锁有什么不同?· 请问在D3D8.0里可否加汉字?要注意什么?多谢! 请问有没有这样一种类似容器的东东,它其中的元素可以是异构类型,比如可以同时放类A,类B的对象 呵呵。前几天狂问问题狂送分,现在分快没了。 我得计算机怎么播放rm格式有问题啦!大侠们给个招吧! 如何在ctree view 中改变tree 的风格? 如何成为一名程序员? 帮帮我!!如何将一个Single(单精度型数)小数点后面那么多位去掉,我只要后面两位就够了。 急需高手(小菜鸟之SOS) 用什么办法可以另存一个表,结构和数据都和原表一样。 much point!!!谁能告诉我html的标准文档在那里可以下载,最好有状态转换图 如下菜单设置语句中,m_a.m_1.m_2.enabled=True ,如果m_2用变量ss,怎样写? 请问,哪里有turbo c3.0-下载,告诉我下载地址/ 各位:你们是怎样将TreeView与数据表联系起来的? 水泥砖健康吗? 氧化镁中有杂质氧化铝,要怎么去除rt 溶解性是不是物理性质 做水泥砖,有碳渣,河沙,石子,求好一点的配料比例 我买的房子是用的空心水泥砖,这样符合国家验收标准吗? 为什么氧化镁能与水反应?而氧化铝却不可以? 水泥砖地原料比例 一个质量为65kg的工人,用图12所示的装置提升一堆水泥砖.若动滑轮重50N,装水泥砖的托板重200N,每块水泥砖重100N.不计摩擦和绳重,当工人匀速提升水泥砖时,此装置的机械效率最高可达到 氧化镁,氧化铝,三氧化铁,四氧化三铁能和水反应吗 工业上如何制取超纯的氧化铝? 图1中有彩色水泥砖4块,图2中有彩色水泥砖7块,图3中有彩色水泥砖10块,像这样,第n个图形要彩色水泥砖几还有一题.3个朋友在一起,每两人握一次手,他们一共握了几次手?4个朋友在一起呢?n个朋 哪种铜的导电率,导热率好?红铜(也就是红铜),黄铜(康铜),铍铜等最好有详细的参数.请分别作答.红铜(也就是紫铜)--上面打错了我现在需要做焊接实验,需要用铜做电极.红铜(也就是紫 关于造价的问题,根据原设计某建筑5层以上要用水泥砖砌筑,施工方就把水泥砖运输至5层以上,而后来建设方要求5层以上又要需要用空心切块砌筑.那原来运到5层的水泥砖就要运下来,那水泥砖 酸与氧化铝的反应做实验时发现用稀盐酸(HCL)和氧化铝(AL2O3)反应时比稀硫酸(H2SO4)和氧化铝反应剧烈谁能帮我解释一下啊?同志们!我知道铝的表面有氧化铝起到了钝化的作用,但是!我 哪种铜 导电,导热性能好,抗腐蚀性哪种材料导电,导热性能好,散热快,抗腐蚀性( 要求耐酸缄)强啊 我也想卖水泥砖 你卖水泥砖赚钱吗? 既然有过氧化镁,那么有过氧化铝吗 水泥砖和粘土砖哪个比较好 在特别寒冷的天气下,零下十七八度到零下二十度,冬暖大棚早上应该几点拉草帘比较合适?一般拉起草帘后棚膜上的水就会迅速结冰,形成冰花这种情况拉草帘行吗?几点拉草帘比较好?请有经验 炉渣空心砖一方的成本是多少?原料为石粉、水泥 一立方水泥砖多少块 能不能用万用表的电阻档测试液体的导电性? 请教免烧砖配料比例,原材料:水泥 粉煤灰 石粉;如果加“岩砂精”可减少水泥用量吗? 为保护耕地,许多地方都不再使用实心粘土砖,广泛使用发泡水泥砖,某发泡水泥切块的长宽厚分别为60cm、25cm、20cm,质量是15Kg,这种发泡水泥建材的密度是______kg/m的3次方 水泥砖有几种 氧化镁与浓硝酸能否反应?如果能 氧化镁到底合不可以和浓硝酸在加热情况下反应?如果能 那么方程式是? 氧化镁和水反应?初中里不是说不是只有生成可溶性碱才能反应嘛,怎么高温还能反应呢 金属的导电性与什么有关? 胃舒平药片中三氧化二铝和氧化镁含量的测定的实验报告,要有实验目的,原理,越详细越好,急用! 童趣第一段在结构上起什么作用?它与其他各段是什么关系 常温下导电性最强的金属是什么? 烧结砖与水泥砖的区别 童趣第一段在结构上起什么作用?他和其他各段是什么关系 为什么金属导电性好? 黄土 红壤 砖红壤 之间肥力的区别黄土 红壤 砖红壤 肥力排序 《爸爸的花儿落了》为何以此题目为题,具有什么深刻的含义?“花”在全文结构中起着什么样的作用? 在硅酸盐水泥系列中,采用不同的水泥施工时(包括冬、夏季施工),应分别注意哪些事项?为什么? 把叶片放在搪瓷杯和砂锅内用碱液煮沸时,为什么用筷子轻轻拨动 氧化镁 氧化铁 氧化铝 氧化铜各是什么颜色 SK5弹性钢热处理硬度要达到HRC53加热温度要多少?铅浴达到硬度HRC63回火多少温度? 菜农一般在早晨阳光照到棚面上时就揭开草帘...菜农一般在早晨阳光照到棚面上时就揭开草帘;选用透光率高、保温性能好的聚录乙烯长寿无滴膜,并及时清扫灰尘,保持膜面清洁;有时还在 二氧化碳变成氧化镁 氧化铁变成氧化铝 怎么能利用置换反应来转化成功? 热处理硬度要达到HRC20-25.5加热温度要多少?回火多少温度?40Cr 菜农常在大棚上这盖草帘这些措施有什么用谢谢了,大神帮忙啊在外界气温较低的时候,菜农常在大棚上这盖草帘,温室前口加防寒裙,有时还将煤炉搬到大棚内.这些措施有什么作用? 碱是否能和氧化镁,氧化铁反应呢? 热处理硬度要达到HRC29.5-34.5加热温度要多少?回火多少温度? 我爸爸在建筑工地买了保险,现在出事故了,我爸在不同省买了保险,现在在老家,想知道保险怎样赔,及下一步怎么操作.急 急, 取少量氧化镁,三氧化二铝,二氧化硅,三氧化二铁混合粉末,加入过量盐酸,充分反应后 中性氧化铝吸附原理是什么 某建筑工地运来4车同样重的水泥,用去11吨,还剩9吨每车水泥多少吨?用方程做 一条环形小道,要用长50cm,宽15cm,厚3cm的水泥砖铺,铺完要用2500块水泥砖.这条小道的铺地面积至少是多少平方米?至少要用多少平方米的水泥砖? 中性氧化铝在气相色谱法中的作用是? 菜农常在大棚盖草连有什么用 一条人行道长20米宽4米用面积20平方分米的水泥砖铺地需要这样的水泥砖多少块, 怎样鉴别一种物质是否是中性氧化铝有一袋柱层层析硅胶,怎样知道它是不是中性氧化铝 金属是导电性还是导热性 溶解性与酸碱性有没有关系?我觉得物质在水中的溶解性越差,物质的酸性或碱性就越弱,那可以用物质在水中的溶解性来判断物质(不是物质的水溶液)是强酸/碱还是弱酸/碱吗?溶解性越好 氧化铝和中性氧化铝有什么区别吗? 为了除去氧化镁中混有的少量杂质三氧化二铝,可选用的试剂是什么?A氢氧化钾溶液B氨水C稀盐酸D氢氧化钠溶液 氧化锌的物理性质,溶解性,导电性,与酸碱的反应?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn