DELPHI多线程编程.doc

上传人:cl****1 文档编号:545044991 上传时间:2023-10-08 格式:DOC 页数:21 大小:63.51KB
返回 下载 相关 举报
DELPHI多线程编程.doc_第1页
第1页 / 共21页
DELPHI多线程编程.doc_第2页
第2页 / 共21页
DELPHI多线程编程.doc_第3页
第3页 / 共21页
DELPHI多线程编程.doc_第4页
第4页 / 共21页
DELPHI多线程编程.doc_第5页
第5页 / 共21页
点击查看更多>>
资源描述

《DELPHI多线程编程.doc》由会员分享,可在线阅读,更多相关《DELPHI多线程编程.doc(21页珍藏版)》请在金锄头文库上搜索。

1、我们知道, WIN95或WIN NT都是多线程的操作系统,在Delphi2.0中,我们可以充分利用这一特性,编写出多线程的应用程序。对以往在DOS或16位windows下写程序的人来说,多线程仍然是陌生的,但如同以前我们从DOS下的单任务过渡到windows 3.1下的多任务,如今我们又必须过渡到多线程领域,毕竟计算机时代是在不断发展的。不过,幸运的是,在Delphi2.0下进行多线程程序设计并不需要我们去学习庞大的WIN32API函数,我们可以利用Delphi下标准的多线程类TThread来完成我们的工作。TThread是一个abstract(抽象)类,也就是说,并不需要根据TThread来

2、声明变量(而且根据TThread声明的变量也是完全无用),我们要做的是把TThread作为基类,用继承的形式来生成子类。实际上,根据TThread来写多线程应用程序是非常容易的。下面就是一个基本的继承TThread生成的多线程类。QuerThrd.PasUnit QuerThrd;InterfaceUsesClasses,DBTables;TypeTQueryThread=class(TThread)privatefQuery:TQuery;protectedprocedure Execute;override;publicconstructor Create(Suspended:Boolea

3、n; Query:TQuery);end;implementationconstructorTQueryThread.Create(Suspended:Boolean;Query:TQuery);begininheritedCreate(Suspended);fQuery:=Query;FreeOnTerminate:=True;end;procedure TQueryThread.Execute;beginfQuery.Open;end;end.在上面这个简单的例子中,我们构造了一个TThread的子类TQueryThread,用于在后台执行数据库查询。在该类的Create函数中,传递了两个

4、参数Suspended和Query,其中Suspended用于控制线程的运行,如果Suspend为真,TQueryThread类的线程在建立后将立即被悬挂,一直到运行了Resume方法,该线程才会继续执行,Query参数用于接受一个已经存在的Query控件(在窗体中真正的Query控件)而使它在多线程的情况下运行。Execute是最重要的过程,它是类TQueryThread的执行部分,所有需要在这个多线程类中运行的语句都必须写在这个过程里。实际上构造自己的多线程类时,并不需要输入所有的这些代码,选择Delphi的File菜单下的new选项,再选TThreadObject项目,Delphi就会为

5、你构造基本的程序模块。然后我们可以根据需要再做相应的修改。进程的执行:假设我们已经建立了一个窗体Form1,窗体中有我们将要使用的查询控件Query1。那么我们在该单元的USES部分加入上面写的QuerThrd单元。procedure TForm1.Button1Click(Sender:TObject);begin建立一个运行的进程TQueryThread.Create(False,Query1);end;如果这个过程被执行,那么窗体中的查询控件Query1就会自动在多线程的环境下运行查询。注意TQueryThread类中只有Create而没有Free,动态建立类以后又忘记删除是我们常犯的错

6、误之一,不过在这里由于我们指定了FreeOnTerminate(运行完即删除)为真,所以当Execute里的语句执行完后,TQueryThread类占据的内存空间将被自动释放。然而还有一个问题值得我们注意,由于同一时刻可以有多个线程同时运行,那么我们还必须解决好同步的问题,如果几个多线程程序之间没有任何关联,那么它们之间也不会有任何冲突。但实际上,可能同时运行几个多线程的数据库应用程序,由于需要共享相同的数据库资源,我们还需要为Query1增加一个Tsession控件。其实,虽然我们也许没有亲自使用过Session控件,但实际上,在所有的数据库访问时Delphi都会自动建立一个临时的Sessi

7、on控件,使用完后又动态地删除掉它。在平常的数据库编程时,用不着我们亲自来操作,但在数据库多线程执行的情况下,为了不相互冲突,我们必须为每个数据库访问都定制自己的Session控件。这个步骤非常简单,我们只需要在窗体中增加一个Session控件,然后给它的属性Sessionname写一个任意的名字,再在Query1的Sessionname中写一个相同的名字。这样我们的数据库程序就安全了。另一类需要解决同步问题的是那些对VCL资源进行操作的程序,这类程序非常多,好在解决的方法也非常简单。我们可以看下面这样一个程序:unit BncThrd;interfaceusesWinProcs,Classe

8、s,Graphics,ExtCtrls;typeTBounceThread=class(TThread)privateFShape:TShape;FXSpeed:Integer;FYSpeed:Integer;procedure MoveShape;protectedprocedure Execute;override;publicconstructor Create(Suspended:Boolean;Shape:TShape;XSpeed,YSpeed:Integer);propertyShape:TShapereadFShape;end;implementationprocedure T

9、Bouad.MoveShape;varMaxHeight,MaxWidth:Integer;Begin with FShape dobeginLeft:=Left+FXSpeed;Top:=Top+FYSpeed;if (Left0) or (Left+WidthParent.Width) thenFXSpeed:=FXSpeed*-1;If (Top0) or (Top+Height.Parent.Height) thenFYSpeed:=FYSpeed*-1;end;end;procedure TBounceThread.Execute;beginWhile not Terminated

10、dobeginSynchronize(MoveShape);end;end;constructor TBounceThread.Create(Suspended:Boolean;Shape:TShape;XSpeed,YSpeed:Integer);begininheritedCreate(Suspended);FShape:=Shape;FXSpeed:=XSpeed;X轴走向的速度FYSpeed:=YSpeed;Y轴走向的速度FreeOnTerminate:=True;end;end.这是一个多线程的碰碰球游戏,你可以有多个不同的球,它们分属不同的线程,各自独立的在屏幕上碰撞。显然,由于多

11、个球运行的显示会同时操作VCL资源,为了安全,我们在Execute过程中的执行部分加入了Synchronize(MoveShape)来调用MoveShape过程,实际上,在任何需要操作VCL资源的地方,例如窗体、位图,都应加入Synchronize调用。执行时我们可以新建一个程序,然后在USES部分加入以上的BncThrd单元,再在它的窗体Form1上加入两个Shape控件Shape1和Shape2,Shape1可以是一个矩形而Shape2是一个圆。加入以下的代码就可以让矩形和圆动起来。procedure TForm1.Button1Click(Sender:TObject);beginTBo

12、unceThread.Create(False,Shape1,1,2);TBounceThread.Create(False,Shape2,2,3);end 多线程的基本概念 WIN 98/NT/2000/XP 是个多任务操作系统,也就是:一个进程可以划分为多个线程,每个线程轮流占用CPU 运行时间和资源,或者说:把CPU 时间划成片,每个片分给不同的线程,这样,每个线程轮流的挂起和唤醒,由于时间片很小,给人的感觉是同时运行的。 多线程带来如下好处:(自己阅读) 1)避免瓶颈; 2)并行操作; 3)提高效率; 在多线程中,通过优先级管理,可以使重要的程序优先操作,提高了任务管理的灵活性。 另一

13、方面,在多CPU 系统中,可以把不同的线程在不同的CPU 中执行,真正做到同时处理多任务(Win 98 只是模拟的,而Win/NT/2000是真正的多CPU同时操作)。 多线程的两个概念: (1)进程:也称任务,程序载入内存,并分配资源,称为一个进程。 注意:进程本身并不一定要正在执行。进程由以下几部分组成: A,一个私有的地址空间,它是进程可以使用的一组虚拟内存地址空间; B,程序的相关代码、数据源; C,系统资源,比如操作系统同步对象等; D,至少包含一个线程(主线程); (2)线程:是程序的执行单位(线程本身并不包括程序代码,真正拥有代码的是进程),每个进程至少包括一个线程,称为主线程,

14、一个进程如果有多个线程,就可以共享同一进程的资源,并可以并发执行。 线程是进程的一个执行单元,是操作系统分配CPU 时间的基本实体,线程主要由如下两部分组成: A,数据结构; B,CPU 寄存器和堆栈; 一个进程中的线程,可以独立运行,也可以控制另一个线程的运行。 请注意: 多线程不能滥用,书上提到了多线程的几个缺点(自阅)。 (3) TThread 对象 虽然Windows 提供了比较多的多线程设计的API 函数,但是直接使用API 函数一方面极其不方便,而且使用不当还容易出错。为解决这个问题,Borland 公司率先推出了一种TThread 对象,来解决多线程设计上的困难,简化了多线程问题的处理。 应该注意,TThread 对象是没有实例的,它和界面的交流,主要依靠主窗体(主VCL线程),这和其他对象使用上有些区别。 一、TThread 对象的主要方法 构造线程: constructor Create(CreateSuspended:boolean) 其中:CreateSuspended为true构造但不唤醒,为false 构造的同时即唤醒 也可以用如下方法 inheried Create(CreateSuspended:boolean) 挂起线程: suspe

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号