摘要载入中…    请稍等…












内容载入中…    请稍等…

如长时间看不到内容,请关闭浏览器,重新打开此页!

芯友首页 应用软件 编程开发 网络硬件 资源下载 动漫音乐 精美图库 芯友论坛 视频教程 电脑技术QQ群:72845454
 ★★photoshop学友-史上最强播放器★★
 位置:编程开发>Deiphi>Deiphi系统文件
◎→ 本类最新
在DELPHI中映射网络驱动器
在Delphi中实现对目录拷贝、删除
在Delphi中接受文件拖放
在Delphi中定位文件位置
用代码打开屏幕保护
用Delphi编程得到OS的类型
用Delphi编码实现程序自启动
◎→相关资源
C语言入门视频教程
C#编程WinForm入门视频
Asp.net入门视频教程下载
VC++编程视频教程下载
VB窗体文章
HTML入门教程
Deiphi实例教程
Deiphi窗体文章
Deiphi数据库编程
Deiphi网络编程
Deiphi图形图象文章
Deiphi系统文件
◎→ 热门资源
Delphi趣味编程实例三则
Delphi如何实现文件关联
Delphi实现网页表单数据的自动提
DELPHI实现文本文件显示和声音同
Delphi使程序具有记忆功能
Delphi使用技巧ABC
Delphi数据库面向对象编程范例

DELPHI下的多线程程序设计


日期:2008-10-20 22:04:34    来源:
   
 ·采用多线程技术来关闭application.messagebox ·Delphi使程序具有记忆功能
 ·Delphi程序设计界面的动态调整
DELPHI下的多线程程序设计


    我们知道,win95或winNT都是“多线程”的操作系统,在DELPHI 2.0中,我们可以充分利用这一特性,编写出“多线程”的应用程序。
  对以往在DOS或16位windows下写程序的人来说,“多线程”仍然是陌生的,但如同以前我们从DOS下的单任务过渡到windows3.1下的多任务,如今我们又必须过渡到“多线程”领域,毕竟计算机时代是在不断发展的。不过,幸运的是,在DELPHI2.0下进行多线程程序设计并不需要我们去学习庞大的WIN32API函数,我们可以利用DELPHI下标准的多线程类TThread来完成我们的工作。
  TThread是一个abstract(抽象)类,也就是说,并不需要根据TThread来声明变量(而且根据TThread声明的变量也是完全无用),我们要做的是把TThread作为基类,用继承的形式来生成子类。实际上,根据TThread来写多线程应用程序是非常容易的。
  下面就是一个基本的继承TThread生成的多线程类。
  QuerThrd.Pas
  unitQuerThrd;
  interface
  uses
  Classes,DBTables;
  type
  TQueryThreadΚclass(TThread)
  private
  fQuery:tQuery;
  protected
  procedureExecute;override;
  public
  constructorCreate(Suspended:Boolean;Query:TQuery);
  end;
  implementation
  constructor
  TQueryThread.Create(Suspended:Boolean;Query:TQuery);
  begin
  inheritedCreate(Suspended);
  fQuery:ΚQuery;
  FreeOnTerminate:ΚTrue;
  end;
  procedureTQueryThread.Execute;
  begin
  fQuery.Open;
  end;
  end.
  在上面这个简单的例子中,我们构造了一个TThread的子类TQueryThread,用于在后台执行数据库查询。在该类的Create函数中,传递了两个参数Suspended和Query,其中Suspended用于控制线程的运行,如果Suspend为真,TQueryThread类的线程在建立后将立即被悬挂,一直到运行了Resume方法,该线程才会继续执行,Query参数用于接受一个已经存在的Query控件(在窗体中真正的Query控件)而使它在多线程的情况下运行。Execute是最重要的过程,它是类TQueryThread的执行部分,所有需要在这个多线程类中运行的语句都必须写在这个过程里。
  实际上构造自己的多线程类时,并不需要输入所有的这些代码,选择DELPHI的File菜单下的new选项,再选“TThreadObject”项目,DELPHI就会为你构造基本的程序模块。然后我们可以根据需要再做相应的修改。
  进程的执行:
  假设我们已经建立了一个窗体FORM1,窗体中有我们将要使用的查询控件Query1。那么我们在该单元的USES部分加入上面写的QuerThrd单元。
  procedureTForm1.Button1Click(Sender:TObject);
  begin
  {建立一个运行的进程}
  TQueryThread.Create(False,Query1);
  end;
  如果这个过程被执行,那么窗体中的查询控件Query1就会自动在多线程的环境下运行查询。注意TQueryThread类中只有Create而没有Free,动态建立类以后又忘记删除是我们常犯的错误之一,不过在这里由于我们指定了FreeOnTerminate(运行完即删除)为真,所以当Execute里的语句执行完后,TQueryThread类占据的内存控件将被自动释放。
  然而还有一个问题值得我们注意,由于同一时刻可以有多个线程同时运行,那么我们还必须解决好同步的问题,如果几个多线程程序之间没有任何关联,那么它们之间也不会有任何冲突。但实际上,可能同时运行几个多线程的数据库应用程序,由于需要共享相同的数据库资源,我们还需要为Query1增加一个Tsession控件。
  其实,虽然我们也许没有亲自使用过Session控件,但实际上,在所有的数据库访问时DELPHI都会自动建立一个临时的Session控件,使用完后又动态地删除掉它。在平常的数据库编程时,用不着我们亲自来操作,但在数据库多线程执行的情况下,为了不相互冲突,我们必须为每个数据库访问都定制自己的Session控件。这个步骤非常简单,我们只需要在窗体中增加一个Session控件,然后给它的属性“Sessionname”写一个任意的名字,并再在Query1的“Sessionname”中写一个相同的名字。这样我们的数据库程序就安全了。
  另一类需要解决同步问题的是那些对VCL资源进行操作的程序,这类的程序非常多,好在解决的方法也非常简单。
  我们可以看下面这样一个程序:
  unitBncThrd;
  interface
  uses
  WinProcs,Classes,Graphics,ExtCtrls;
  type
  TBounceThreadΚclass(TThread)
  private
  FShape:TShape;
  FXSpeed:Integer;
  FYSpeed:Integer;
  procedureMoveShape;
  protected
  procedureExecute;override;
  public
  constructorCreate(Suspended:Boolean;Shape:TShape;XSpeed,YSpeed:Integer);
  propertyShape:TShapereadFShape;
  end;
  implementation
  procedureTBouad.MoveShape;
  var
  MaxHeight,MaxWidth:Integer;
  begin
  withFShapedo
  begin
  Left:ΚLeft+FXSpeed;
  Top:ΚTop+FYSpeed;
  if(LeftΙ0)or
  (Left+WidthΛParent.Width)then
  FXSpeed:ΚFXSpeed*-1;
  if(TopΙ0)or
  (Top+HeightΛParent.Height)then
  FYSpeed:ΚFYSpeed*-1;
end;
  end;
  procedureTBounceThread.Execute;
  begin
  WhilenotTerminateddo
  begin
  Synchronize(MoveShape);
  end;
  end;
  constructorTBounceThread.Create(Suspended:Boolean;Shape:TShape;XSpeed,YSpeed:Integer);
  begin
  inheritedCreate(Suspended);
  FShape:ΚShape;
  FXSpeed:ΚXSpeed;{X轴走向的速度}
  FYSpeed:ΚYSpeed;{Y轴走向的速度}
  FreeOnTerminate:ΚTrue;
  end;
  end.
  这是一个多线程的碰碰球游戏,你可以有多个不同的球,它们分属不同的线程,各自独立的在屏幕上碰撞。显然,由于多个球运行的显示会同时操作VCL资源,为了安全,我们在Execute过程中的执行部分加入了Synchronize(MoveShape)来调用MoveShape过程,实际上,在任何需要操作VCL资源的地方,例如窗体、位图,都应加入Synchronize调用。
  执行时我们可以新建一个程序,然后在USES部分加入以上的BncThrd单元,再在它的窗体FORM1上加入两个Shape控件Shape1和Shape2,Shape1可以是一个矩形而Shape2是一个圆。加入以下的代码就可以让矩形和圆动起来。
  procedureTForm1.Button1Click(Sender:TObject);
  begin
  TBounceThread.Create(False,Shape1,1,2);
  TBounceThread.Create(False,Shape2,2,3);
  end;

 [1]

Delphi程序使用资源的释放

DELPHI程序注册码设计

--->QQ群登防盗登录器 V0.15┊多线程加快QQ多号同时登录速度┊简体中文绿色免费版
--->uTorrent V1.70 Build 1825 Beta┊很小巧的BT客户端程序┊多国语言绿色免费版
--->AlbumUp V0.39┊综合相册批量上传程序、支持网易163相册┊简体中文绿色免费版
--->AlbumCon V0.70┊综合型相册批量下载程序、支持网易相册┊简体中文绿色免费版
--->PATmonitorTrial V1.9.3 f┊是全能的专利下载和专利管理程序┊汉化绿色特别版
Tags:  多线程 程序 设计
{$enumber$}
芯友网版权所有 1999-2006 | 著作权与商标声明 | 法律声明 | 服务条款 | 隐私声明 | 联系我们