在窗体的create事件中有个for循环。for i=1 to n(最多为3)。
在每个循环中都创建一个线程,在每个线程里创建一个数据连接ADOConnection(连不同数据源),个几个adoquery。
然后打开ADOConnection,打开每个adoquery。... 然后关闭adoquery,ADOConnection。再释放线程。
即创建线程,执行某操作后,再释放线程(如果没有线程,则ADOConnection连续创建,但我要ADOConnection并发创建)。请问:在for循环中创建线程,能做到吗???如能,请你们把代码奉上。无限感谢!!!(不需要创建ADOConnection和adoquery)

解决方案 »

  1.   

    当然可以创建线程
    var
      i: Integer;
    begin
      for i := 0 to n do
        TMyThread.Create(False);
    end;为了方便生成的线程管理,可以定义一个Tlist来放生成的线程
    TThreadList :TList;
    TThreadList := TList.create;var
      i: Integer;
    begin
      for i := 0 to n do
        TThreadList.Add(TMyThread.Create(False));
    end;
      

  2.   

    to Dlwxn(蓝天):首先谢谢你。
      但小第刚学线程,不是很明,请你把整个unit写出来好吗?拜托了!!!!
      

  3.   

    type
      zxr = class(TThread)
      private
        procedure SetName;
      protected
        procedure Execute; override;
      end;implementation
    uses unit1;{ Important: Methods and properties of objects in visual components can only be
      used in a method called using Synchronize, for example,      Synchronize(UpdateCaption);  and UpdateCaption could look like,    procedure zxr.UpdateCaption;
        begin
          Form1.Caption := 'Updated in a thread';
        end; }{$IFDEF MSWINDOWS}
    type
      TThreadNameInfo = record
        FType: LongWord;     // must be 0x1000
        FName: PChar;        // pointer to name (in user address space)
        FThreadID: LongWord; // thread ID (-1 indicates caller thread)
        FFlags: LongWord;    // reserved for future use, must be zero
      end;
    {$ENDIF}{ zxr }procedure zxr.SetName;
    {$IFDEF MSWINDOWS}
    var
      ThreadNameInfo: TThreadNameInfo;
    {$ENDIF}
    begin
    {$IFDEF MSWINDOWS}
      ThreadNameInfo.FType := $1000;
      ThreadNameInfo.FName := 'zxr';
      ThreadNameInfo.FThreadID := $FFFFFFFF;
      ThreadNameInfo.FFlags := 0;  try
        RaiseException( $406D1388, 0, sizeof(ThreadNameInfo) div sizeof(LongWord), @ThreadNameInfo );
      except
      end;
    {$ENDIF}
    end;procedure zxr.Execute;
    var
      i,j,k:integer;
      a:int64;
    begin
      SetName;
      { Place thread code here }
      a:=0;
      freeonterminate:=true;
      form1.Canvas.Font.Size:=16;
      form1.Canvas.Font.Name:='楷体';
      form1.Canvas.TextOut(10,10,'正在用一个线程进行复杂的计算,这段时间,窗口会响应你的任何事件!');
      for i:=0 to 200 do
        for j:=0 to 200 do
          for k:=0 to 20000 do
            begin
              a:=a+1;
            end;
      form1.Canvas.TextOut(10,10,'                                                                                       ');
      form1.Canvas.TextOut(10,10,'结果为:'+inttostr(a));
    end;end.
      

  4.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure FormCreate(Sender: TObject);
        procedure Button1Click(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
      private
        { Private declarations }
        ThreadList: TList;
      public
        { Public declarations }
      end;  TMyThread = class(TThread)
      private
        { Private declarations }
      protected
        procedure Execute; override;
      end;var
      Form1: TForm1;implementation{$R *.dfm}{ TMyThread }procedure TMyThread.Execute;
    begin
      inherited;
      //线程的执行代码
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      ThreadList := TList.Create;
    end;procedure TForm1.Button1Click(Sender: TObject);
    const
      n = 3;
    var
      i: Integer;
    begin
      for i := 1 to 3 do
        ThreadList.Add(TMyThread.Create(False));
    end;procedure TForm1.FormDestroy(Sender: TObject);
    begin
      ThreadList.Free;
    end;end.
      

  5.   

    谢谢2位:
    procedure Tmythread.Execute;
    var
      lADOConnection:TADOConnection;
      lADOQuery:TADOQuery;
    begin
      lADOConnection:=TADOConnection.Create(nil);
      lADOQuery:=TADOQuery.Create(nil);
      ...
      lADOQuery.Free;
      lADOConnection.Free;
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      i:integer;
    begin
      for i:=1 to 5 do
        begin
          TMythread.create(false);
        end;
    end;请问:我创建了线程,ADOConnection,ADOQuery。最后释放了ADOConnection,ADOQuery后,线程有没有释放的,怎释放的?
      

  6.   

    创建可以在线程的Create里面写;释放在线程的Destory里面写,具体怎么写你可以搜索一下,网上很多的.
      

  7.   

    to Dlwxn(蓝天) :
       能否在下面就释放线程(即释放了数据集)?
    procedure Tmythread.Execute;
    var
      lADOConnection:TADOConnection;
      lADOQuery:TADOQuery;
    begin
      lADOConnection:=TADOConnection.Create(nil);
      lADOQuery:=TADOQuery.Create(nil);
      ...
      lADOQuery.Free;
      lADOConnection.Free;
    end;
      

  8.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, DB, ADODB;type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure FormCreate(Sender: TObject);
        procedure Button1Click(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
      private
        { Private declarations }
        ThreadList: TList;
      public
        { Public declarations }
      end;  TMyThread = class(TThread)
      private
        { Private declarations }
        lADOConnection:TADOConnection;
        lADOQuery:TADOQuery;
      protected
        procedure Execute; override;
      public
        constructor Create;
        destructor Destroy; override;
      end;var
      Form1: TForm1;implementation{$R *.dfm}{ TMyThread }constructor TMyThread.Create;
    begin
      lADOQuery := TADOQuery.Create(nil);
      lADOConnection := TADOConnection.Create(nil);
      inherited Create(False);
    end;destructor TMyThread.Destroy;
    begin
      if Assigned(lADOQuery) then
        FreeAndNil(lADOQuery);
      if Assigned(lADOConnection) then
        FreeAndNil(lADOConnection);
      inherited;
    end;procedure TMyThread.Execute;
    begin
      inherited;
      //线程的执行代码
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      ThreadList := TList.Create;
    end;procedure TForm1.Button1Click(Sender: TObject);
    const
      n = 3;
    var
      i: Integer;
    begin
      for i := 1 to 3 do
        ThreadList.Add(TMyThread.Create);
    end;procedure TForm1.FormDestroy(Sender: TObject);
    begin
      ThreadList.Free;
    end;end.
      

  9.   

    procedure TForm1.FormDestroy(Sender: TObject);
    begin
      ThreadList.Free;
    end;
    这个里面有错误,最后free的时候先把里面的线程给释放,删除掉。写的时候忘记了。
      

  10.   


    谢谢 Dlwxn(蓝天) 先。
         刚才开会,下午试试。
      

  11.   

    如果线程里面仅仅执行一次的话,你的生成和释放代码也是可以的。
    不过最后用try...finally...end.
      

  12.   

    to Dlwxn(蓝天):在吗?你理解我的意思了。我是要在数据集关闭,释放后,随着释放线程。procedure Tmythread.Execute;
    var
      lADOConnection:TADOConnection;
      lADOQuery:TADOQuery;
    begin
      lADOConnection:=TADOConnection.Create(nil);
      lADOQuery:=TADOQuery.Create(nil);
      ...
      lADOQuery.Free;
      lADOConnection.Free;
      //在次释放线程,因为上面的数据集已经释放了
    end;而不是在线程释放后,释放数据集。
    destructor TMyThread.Destroy;---------下面代码,我想是:线程释放后,就释放数据集。
    begin
      if Assigned(lADOQuery) then
        FreeAndNil(lADOQuery);
      if Assigned(lADOConnection) then
        FreeAndNil(lADOConnection)
      inherited;
    end;
      

  13.   

    如果在procedure Tmythread.Execute; 这个过程里面没有死循环的话你的代码也是可以的,如果有的话,每次执行都要生成然后释放不是很好的方法。不如直接在create的时候create一个,在程序中直接使用。