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

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

缓存线程

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

横跨四大操作系统:3DMark将挑战所有智能设备 美国碰壁欧洲得意 华为获CERN青睐 应用数据分析新标准:Flurry增应用崩溃分析功能 Twitter被黑客入侵,25万用户信息可能被窃 16亿美元超级计算机项目助力解读人脑 卡巴斯基发现新型Android恶意软件 可入侵Windows 谷歌发布基于B-Tree的C++模板库 开源产品系列:高性能Web框架Zend Framework LiFi是否会取代WiFi? 1月浏览器排行:IE10突破1% Chrome连续3月下滑 Wine让Android也能运行Windows软件 Cory Ondrejka,是这位工程师拯救了Facebook! 三星争夺企业市场的三大痛点与对策 Xcode更新至4.6 支持iOS 6.1 工程师揭秘:NVIDIA如何锻造Android掌机 VMware掌控Puppet 老用户会被锁定吗? 试图领导创新:三星创新中心11亿美元建基金 基于WebRTC Chrome与Firefox实现视频通话 将OpenStack私有云部署到Hadoop MapReduce环境 Web设计师必备的10款最佳排版工具 诺基亚CEO谈平板计划 Android为候选系统 244亿美元!戴尔公司正式完成私有化 对抗苹果 Facebook或推Find My Friends应用 前谷歌工程团队负责人:如何打造一个完美的产品 好消息!Google Drive可存储共享JavaScript等网站 Android Rivers:用Kotlin语言写出的新闻应用 辞旧迎新 老牌游戏开发商的移动进化之路 iSuppli:硬盘市场持续萎缩 大数据应用成重要市场 全球最大校园Hackathon:失败后,你能学到什么? 走进Evasi0n,越狱黑客如何拿到iOS权限 提升服务扩展性和冗余的八个编码方向 我做的鉤子,為什麼不能截獲WM_DESTROY消息 有谁用过java+Dimino开发过项目? vcl的类的析构函数怎么继承? 紧急求助!在线等待! DELPHI怎样通过ADO来对DBASE3的数据库表进行物理删除?高手请进 如何使用C给FOX的DBF库加上索引. Encrypt加密源码 将桌面存为图像文件? DIRECTX3D问题 如何统计字符串中的字符数量! 怎样知道自己电脑的声卡是什么型号?并安装相应的驱动程序? 跳转窗口的时候如何消除工具栏 使用cuteftp时出的错! 怎么能添加一个链接 寻求使用rtp/rtcp的实时视频传输例子!! 输入法与文字处理程序间的关系是怎样? 如何使数据窗口的全部数据默认选定!? 请问,Delphi中有类似VC的静态变量吗? 想要一个用jsp做的新闻发布系统 请问ORACLE的凭证检索失败是怎么回事?--谢谢 char *mdd=5 内存中进行了什么动作?可否解释一下 我想问多下,那wininet.dll 文件是不是nt的系统都有噶? 搞得我头都大了的"多媒体"问题??????????? 重新调用一个方法。 Query的问题? active report作出的报表地下怎么会有这个公司的广告呀? 求救:关于树在建立游戏模型上的应用,及说明 Win2000下屏蔽Win键 怎么把字符串拷到另一个字符串数组里 Delphi_Li(Delphi Li) ,lincanwen(海) ,Focus(老鱼) 刚才关于opengl的帖子手一发抖就给结了,对不住,麻烦来领分,谢谢各位 请教大家关于 认证考试 的问题 更改窗口标题条文字 jsp连接domino数据库? 帮我分析一下!!!!!!!!!!!!! 关于oracle的问题,很急 capDriverConnect函数和capDriveDisconnect函数疑问 crystal report 的问题 Delphi调用win32函数的帮助borland公司提供了吗? 请介绍几本考网络设计师的参考书! 怎样设置另一个对话框IDC_EDIT的值 在线等待:在Java中是否有权限修改一个文件的权限? 【 刚才很生气,深圳农民意识的人太多了,做出的事情好可笑,我很生气 】 急需Java程序员 有谁用过链接服务器? 关于用java连接domino数据库? 如何判断一个已打开的socket的状态? 坏习惯不知道该不该改,给个建议。来者有分! vc sdk下作'帮助'功能,怎么写代码.需要什么资源? 看看这个错误。有关ADO 连接sybase 数据库的问题。 各位大哥,救救小第吧。分数随你开口(我有1357分)。拜托拜托!!!! C++ primer中文版中的几个错误! 为什么Mg+O2点燃是MgO不是MgO2镁的化合价不是+2么、然后氧的化合价不是-2么.约分掉是一比一、应该没变化的呀.为什么会是MgO.禁止复制他人的答案.如果别人的答案看得懂、我就不会问了.MgO2的 时事资讯是什么意思 15N的物体浸没在水中收到的浮力是8N,那么这个物体在水中是() A、悬浮 B、漂浮 C、下沉 D、上浮 为什么甲烷与氯气比例为1:4时,会完全生成四氯甲烷 谁有物理公式大全? 一物体重10N,浸没在水中,受到的浮力为8N,则他将下沉,当它停在容器底部时,物体受的浮力为多少 问一道生活中的物理题两本语文课本,都有260多页,把他俩的每页都交叉起来(就像洗牌一样),并叠起来的部分长20厘米,宽8厘米,把两本课本完全交叉以后,我用尽全身力气,整得面红耳赤都拉不 最近的有意义的有趣的故事或新闻 怎样去南极旅行?最好是跟团,费用多少?线路? 含容电路中电容器有没有电阻? 物理公式大全~请告诉我~谢谢咯 去南极旅游多少钱所有活动 计量一个城市面积以什么作单位 代表性和故事性是什么意思 南极旅游需要多少钱 人造地球卫星每分钟大约飞行499.2千米,0.9小时能飞行多少千米?急 如题... 计算面积(单位厘米)快点第一采纳! 物理的公式大全在哪里可以找的到? 一颗人造地球卫星8秒航行64千米,照这样计算,14秒可以航行多少千米?(用比例解)kkk! 为什么当人造卫星速度慢到每秒钟7千里左右,就不能再绕地球飞行了?请问一楼 为什么此时飞船的惯性减慢了 失去了地球对它的引力了 请问二楼 为什么如果卫星速度降低,它所需要的向心力 新闻里经常有什么什么“门”事件,比如说“间谍门”. 南极是不是最冷的 关于走一步再走一步将困难分解有关名言 物理公式大全 谢谢1! 为什么南极会那么冷 走一步再走一步的相同名言警句要有中心的名言警句. 怎么去南极旅游 2011年水稻价格 走一步再走一步可用哪句名言警句来概括? 有人去南极旅游吗 我国国土中,平原面积比丘陵多1/5,平原面积是丘陵的( ) A.6/5 B.4/5 C.5/6拜托了各位 谢谢 高数,利用判别法 讨论反常积分的收敛性e^-axcosxdx(a>0)从0积到正无穷 东北黑龙江那边冬天最冷的时候多少摄氏度? Mg+O2=MgO CO2+NaOH=NaCO3+H2O Fe+Cl2=FeCl3 NaOH+H2SO4=Na2SO4+H2O 请将这些化学方程式配平, 请问这个高数反常积分审敛法的证明过程 这个比较审敛法1怎么证明? 比黑龙江气候还冷的是哪里? C+O2=CO2 这个化学方程式和这个化学方程式Mg+o2=Mgo 好像没有配平,还是配平好了,(理由) 怎样去南极旅游? 小企业会计主要包含下列哪几个特点 为什么人造地球卫星绕地球飞行不会落下来,而抛出的石头会落地.不用非常详细,但要组织好语言.因为人造卫星和飞船发射出去以后,它以特别大的速度围绕地球运转,抵挡住了地球对它的引 南极旅游的一些要求是什么啊? 设地球的质量为M,平均半径为R,自转角速度为ω,引力常量为G,则有关同步卫星的说法正确的是A.同步卫星的轨道与地球的赤道在同一平面内B.同步卫星的离地高度为C.同步卫星的离地高度为 人造地球卫星能够绕地球飞行,与________和____有关 如何去南极旅行 鲁迅的故乡表达的思想感情 地球外有几颗人造卫星绕地球飞行?请把它们中的"之最"介绍一下 个人如何去南极旅行? 为什么东北的冬天十分寒冷 以物理学角度回答 南极最冷吗? 到南极旅游的 一些条件 是什么 到南极旅游有什么要求 南极怎么那么冷呢? 夏天热,是不是太阳到地球距离近? 《故乡》中我们可以感受到鲁迅的强烈愿望是? 谁知道现在水稻价格.我是黑龙江方正的.我还有水稻.北稻五长粒稻有收的吗?多少钱. 甲烷与氯气在光照下反应能否生成纯净的四氯甲烷 用R表示地球半径,M表示地球质量,G表示万有引力常量.请问第二宇宙速度怎么写?这是高三综合卷上的题 现在黑龙江省水稻价格? 故事性啥意思?有个读书征文要求里面写要故事性强,可又写题材不限不明白>故事性强不是要写记叙文之类的?读书征文啊怎么写?议论文可以不. 鲁迅 故乡 读后体会,这本小说的读后体会
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘