新建Thread Object,写好Execute方法就可以了,很简单的

解决方案 »

  1.   

    引一篇文章给你:
    线程排序
      在数据处理量很大的情况下,如何在数据处理的同时响应用户操作?Windows95/98和WindowsNT作为多线程的多任务操作系统,其调度单元是线程,即线程是系统分配处理器时间资源的基本单元,所以我们可以利用线程实现在处理大批量数据的同时响应用户操作。
      DELPHI作为一个优秀的开发平台,对开发多线程应用程序提供了强有力的支持,即可直接利用32位Windows环境提供的Win32API接口函数CreateThread,也可利用DELPHI中提供的BeginThread函数。在下面例子中,正是使用了DELPHI提供的TThread类。
      一.基本的方法如下:  1.从Tthread类派生一个新类。(创建TSortThread类)
      2.定义新类的Create方法。
      3.定义新类的Execute方法,并在Execute方法中插入线程运行时执行的代码。
      4.引用类方法创建实例。
      二.例子的详细代码及说明:
      首先,新建一个单元,保存为mysort.pas.在此单元中,我们创建了一个TSortThread类,它从TThread类中继承而来,所以当我们在程序中创建这个类的一个实例时,也就是创建了一个新的线程。
      接着,在该类中定义一个Sort方法,用来对数组进行排序,同时TSortThread类超越了TThread类的构造方法Create和Execute,在execute方法中,调用了对数组进行排序的Sort方法。具体代码如下:  unitmysort;
      interface
      usesClasses;//TThread类在Classes中被定义。
      type
      PSortArray=TSortArray;
    TSortArray=array.[0..MaxIntdivSize
    Of(Integer)-1]ofInteger;
      {此处定义了TsortThread类}
      TSortThread=class(TThread)
      Private
      {在TSortThread类中定义了如下几个私有变元}
      FSortArray:PSortArray;
      FSize:Integer;
      FA,FB,FI,FJ:Integer;
      Protected
      {类TSortThread超越了类Tthread的Execute方法}
      procedure Execute;override;
      {类TsortThread添加了一个Sort方法}
      procedure Sort(varA:arrayofInteger);  public
      {类TSortThread超越了类Tthread的构造方法}
      constructorCreate(varSortArray:arrayofInteger);
      end;
      implementation
      constructorTSortThread.Create(varSortArray:arrayofInteger);
      begin
      FSortArray:=@SortArray;
      FSize:=High(SortArray)-Low(SortArray)+1;
      FreeOn Terminate:=True;
      inheritedCreate(False);
      end;
      {当线程开始时,Execute方法将被调用。}
      procedure TSortThread.Execu
    te;
      begin
      Sort(Slice(FSortArray,FSize));
      end;
      {下面实现了冒泡法排序}
      procedure TSortThread.Sort(varA:arrayofInteger);  var
      I,J,T:Integer;
      begin
      for I:=High(A)downto Low(A) do
      for J:=Low(A)to High(A)-1 do
      if A[J]>A[J+1] then
      begin
      T:=A[J];
      A[J]:=A[J+1];
      A[J+1]:=T;
      if Terminated then Exit;
      end;
      end;
      end
      最后,在用户应用程序的implementation处加入usesmysort,在执行排序的地方加入TQuickSortthread.Create(SortArray),其中SortArray为一实际的数组。这样就可以用线程实现排序,在排序过程中,用户不必等到排序结束就可以执行其它操作。这种用多线程实时响应用户操作方法在涉及大量数据处理的应用程序中显得尤为重要。
      

  2.   

    看看 \Help\Examples\Prgrsbar 里的代码,会受到很多启发的。
      

  3.   

    引一篇文章给你:DELPHI下的多线程程序设计我们知道,win95或winNT都是“多线程”的操作系统,在DELPHI 2.0中,我们可以充分利用这一特性,编写出“多线程”的应用程序。 
      对以往在DOS或16位windows下写程序的人来说,“多线程”仍然是陌生的,但如同以前我们从DOS下的单任务过渡到windows3.1下的多任务,如今我们又必须过渡到“多线程”领域,毕竟计算机时代是在不断发展的。不过,幸运的是,在DELPHI2.0下进行多线程程序设计并不需要我们去学习庞大的WIN32API函数,我们可以利用DELPHI下标准的多线程类TThread来完成我们的工作。 
      TThread是一个abstract(抽象)类,也就是说,并不需要根据TThread来声明变量(而且根据TThread声明的变量也是完全无用),我们要做的是把TThread作为基类,用继承的形式来生成子类。实际上,根据TThread来写多线程应用程序是非常容易的。 
      下面就是一个基本的继承TThread生成的多线程类。 
    unit MainhThread;
    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资源进行操作的程序,这类的程序非常多,好在解决的方法也非常简单。 
      我们可以看下面这样一个程序: 
      unit BncThrd; 
      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; 
      

  4.   

    1。file->new->thread...再在.execute里写你想要的代码,不过要同步
    2。用api函数createthread,执行一个回调函数,此回调函数就是你要执行的代码
      

  5.   

    Delphi中实现多线程同步查询
    (苏涌 2001年06月07日 21:39)
    优秀的数据库应用应当充分考虑数据库访问的速度问题。通常可以通过优化数据库、优化 查询语句、分页查询等途径收到明显的效果。即使是这样,也不可避免地会在查询时闪现一个带有 SQL符号的沙漏,即鼠标变成了查询等待。最可怜的是用户,他(她)在此时只能无奈地等待。遇到急性子的,干脆在此时尝试 Windows中的其它应用程序,结果致使你的数据库应用显示一大片白色的窗口。真是无奈!本文将以简单的例子告诉你如何实现线程查询。还等什么,赶快打开Delphi对照着下面的完整源代码试试吧。在查询时能够做别的事情或者取消查询,这只是基本的线程查询,在你阅读了Delphi有关线程帮助之后能立刻实现。这里介绍的是多个线程查询的同步进行。在Delphi数据库应用中,都有一个缺省的数据库会话 Session。通常情况下,每个数据库应用中只有这一个会话。无论是查询函数修改数据,在同一时间内只能进行其中的一件事情, 而且进行这一件事情的时候应用程序不能响应键盘、鼠标以及其它的 Windows消息。这就是在 窗口区域会显示一片空白的原因所在。当然,只要将查询或数据操纵构造成线程对象,情况会好一些,至少可以接受窗口消息,也可以随时终止查询或数据操纵,而不会在屏幕上显示出太难看的白色。不过,这只是解决了问题的一部分。假如在进行一个线程查询的时候,用户通过 按钮或菜单又发出了另一个查询的命令,这可如何是好,难道终止正在执行的数据库访问吗? 解决之道就是:多线程同步查询。实现多线程同步查询的基本思想是,为每一个查询组件(如TQuery组件)创建一个独占的 数据库会话,然后各自进行数据库访问。需要特别注意的是,因为Delphi中的 VCL组件大多都 不是线程安全的,所以应当在线程查询结束后再将DataSource组件与查询组件关联,从而显示 在DBGrid组件中。下面的例子只实现了静态的线程同步查询,即线程对象是固定的,并随窗体的创建和销毁 而创建和销毁。你可以就此进行改进,为每一个数据查询或数据操纵命令创建一个单独的线程对象,从而达到多线程同步查询的目的。注意:应用程序中的线程不是越多越好,因为线程将严重吞噬CPU资源,尽管看上去并不明显。谨慎创建和销毁线程将避免你的应用程序导致系统资源崩溃。下面的例子给出了同时进行的两个线程查询。第一次按下按钮时,线程开始执行;以后每次按下按钮时,如果线程处于挂起状态则继续执行,否则挂起线程;线程执行完毕之后将连接 DataSource,查询结果将显示在相应的DBGrid中。{ 这里的多线程同步查询演示程序仅包括一个工程文件和一个单元文件 }
    { 窗体中放置的组件有:          }
    {     两个Session组件           }
    {     两个Database组件          }
    {     两个Query组件             }
    {     两个DataSource组件        }
    {     两个DBGrid组件            }
    {     一个Button组件            }
    { 除非特别说明,否则上述各组件的属性都取默认值(见各组件注释) }
    { 对于Database组件,就和一般设置一样,有一个正确的连接即可     }
    { 对于Query 组件,需要在各自的属性 SQL中添加一些查询语句,为了 }
    { 看得更清除,建议不要在两个Query 组件中填写相同的查询语句。   }unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      Db, DBTables, Grids, DBGrids, StdCtrls;type
      TForm1 = class(TForm)
        Session1: TSession;         { 属性SessionName填写为S1                 }
        Database1: TDatabase;       { 属性SessionName选择为S1                 }
        Query1: TQuery;{ 属性Database选择为Database1;属性SessionName选择为S1 }
        DataSource1: TDataSource;   { 属性DataSet设置为空                     }
        DBGrid1: TDBGrid;           { 属性DataSource选择为DataSource1         }
        Session2: TSession;         { 属性SessionName填写为S2                 }
        Database2: TDatabase;       { 属性SessionName选择为S2                 }
        Query2: TQuery;{ 属性Database选择为Database2;属性SessionName选择为S2 }
        DataSource2: TDataSource;   { 属性DataSet设置为空                     }
        DBGrid2: TDBGrid;           { 属性DataSource选择为DataSource2         }
        BtnGoPause: TButton;        { 用于执行和挂起线程                      }
        procedure FormCreate(Sender: TObject);      { 创建窗体时创建线程对象  }
        procedure FormDestroy(Sender: TObject);     { 销毁窗体时销毁线程对象  }
        procedure BtnGoPauseClick(Sender: TObject); { 执行线程和挂起线程      }
      private
      public
      end;  TThreadQuery = class(TThread) { 声明线程类 }
      private
        FQuery: TQuery;             { 线程中的查询组件                     }
        FDataSource: TDataSource;   { 与查询组件相关的数据感知组件         }
        procedure ConnectDataSource;{ 连接数据查询组件和数据感知组件的方法 }
      protected
        procedure Execute; override;{ 执行线程的方法                       }
      public
        constructor Create(Query: TQuery;
                           DataSource: TDataSource); virtual; { 线程构造器 }
      end;var
      Form1: TForm1;
      Q1,                   { 线程查询对象1 }
      Q2: TThreadQuery;     { 线程查询对象2 }implementation{$R *.DFM}{ TThreadQuery类的实现 }{ 连接数据查询组件和数据感知组件}
    procedure TThreadQuery.ConnectDataSource;
    begin
      FDataSource.DataSet := FQuery;{ 该方法在查询结束后才调用 }
    end;procedure TThreadQuery.Execute;{ 执行线程的方法 }
    begin
      try
        FQuery.Open;                   { 打开查询 }
        Synchronize(ConnectDataSource);{ 线程同步 }
      except
        ShowMessage('Query Error');    { 线程异常 }
      end;
    end;{ 线程查询类的构造器 }
    constructor TThreadQuery.Create(Query: TQuery; DataSource: TDataSource);
    begin
      FQuery := Query;
      FDataSource := DataSource;
      inherited Create(True);
      FreeOnTerminate := False;
    end;{ 创建窗体时创建线程查询对象 }
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      Q1 := TThreadQuery.Create(Query1, DataSource1);
      Q2 := TThreadQuery.Create(Query2, DataSource2);
    end;{ 销毁窗体时销毁线程查询对象 }
    procedure TForm1.FormDestroy(Sender: TObject);
    begin
      Q1.Terminate; { 销毁之前终止线程执行 }
      Q1.Destroy;
      Q2.Terminate; { 销毁之前终止线程执行 }
      Q2.Destroy;
    end;{ 开始线程、继续执行线程、挂起线程 }
    procedure TForm1.BtnGoPauseClick(Sender: TObject);
    begin
      if Q1.Suspended then Q1.Resume else Q1.Suspend;
      if Q2.Suspended then Q2.Resume else Q2.Suspend;
    end;