本帖最后由 GuestCode 于 2009-10-16 01:13:14 编辑

解决方案 »

  1.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, GThreadPool, ADODB, ActiveX, ExtCtrls;type
      TMyThreadPool = class(TGThreadPool)
      protected
        procedure OnRun(pData: Pointer; Sender, wParam, lParam: DWord); override;
        procedure OnThreadBegin(Thread: DWord); override;
        procedure OnThreadEnd(Thread: DWord); override;
      end;  TForm1 = class(TForm)
        Button1: TButton;
        Timer1: TTimer;
        procedure Button1Click(Sender: TObject);
        procedure Timer1Timer(Sender: TObject);
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      protected  public
        { Public declarations }
        FRunCount: Integer;
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    var
      TP: TMyThreadPool;
      i: Integer;
    begin
      FRunCount := 0;
      TP := TMyThreadPool.Create(4);
      for i := 1 to 1000000 do
        TP.PostQueue(DWORD(Self), 0, 0);
      TP.Destroy();
    end;{ TMyThreadPool }procedure TMyThreadPool.OnRun(pData: Pointer; Sender, wParam,
      lParam: DWord);
    var
      DBC: TADOConnection;
    begin
      DBC := TADOConnection(pData);
      //做数据库处理
      
      InterlockedIncrement(TForm1(Sender).FRunCount);
    end;procedure TMyThreadPool.OnThreadBegin(Thread: DWord);
    var
      DBC: TADOConnection;
    begin
      //线程内初始化数据库,并创建数据库会话
      CoInitialize(nil);
      DBC := TADOConnection.Create(nil);
      //如果还有TQuery,请定义数据结构,把数据结构指针传给SetData
      SetData(Thread, DBC);
    end;procedure TMyThreadPool.OnThreadEnd(Thread: DWord);
    begin
      TADOConnection(GetData()).Destroy();
      CoUninitialize();
    end;procedure TForm1.Timer1Timer(Sender: TObject);
    begin
      Caption := IntToStr(FRunCount);
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      FRunCount := 0;
    end;end.