unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, DB, Grids, DBGrids, ADODB, DBTables;type
  TForm1 = class(TForm)
    DBGrid1: TDBGrid;
    DataSource1: TDataSource;
    Button1: TButton;
    ADOQuery1: TADOQuery;
    procedure FormCreate(Sender: TObject); { 创建窗体时创建线程对象 }
procedure FormDestroy(Sender: TObject); { 销毁窗体时销毁线程对象 }    procedure Button1Click(Sender: TObject); { 执行线程和挂起线程 }
  private
    { Private declarations }
  public
    { Public declarations }
  end;TThreadQuery = class(TThread) { 声明线程类 }
private
FQuery: TADOQuery; { 线程中的查询组件 }
FDataSource: TDataSource; { 与查询组件相关的数据感知组件 }
procedure ConnectDataSource;{ 连接数据查询组件和数据感知组件的方法 }
protected
procedure Execute; override;{ 执行线程的方法 }
public
constructor Create(Query:TADOQuery;DataSource: TDataSource); virtual; { 线程构造器 }
end;var
Form1: TForm1;
Q1:TThreadQuery; { 线程查询对象1 }
///Q2:TThreadQuery; { 线程查询对象2 }implementation{$R *.DFM} { TThreadQuery类的实现 } { 连接数据查询组件和数据感知组件}
procedure TThreadQuery.ConnectDataSource;
begin
FDataSource.DataSet := FQuery;{ 该方法在查询结束后才调用 }
end;procedure TThreadQuery.Execute;{ 执行线程的方法 }
begin
tryFQuery.Open; { 打开查询 }
Synchronize(ConnectDataSource);{ 线程同步 }
except
ShowMessage('Query Error'); { 线程异常 }
end;
end;{ 线程查询类的构造器 }
constructor TThreadQuery.Create(Query: TADOQuery; DataSource: TDataSource);
begin
FQuery := Query;
FDataSource := DataSource;
inherited Create(True);
FreeOnTerminate := False;
end;{ 创建窗体时创建线程查询对象 }
procedure TForm1.FormCreate(Sender: TObject);
begin
Q1 := TThreadQuery.Create(ADOQuery1, DataSource1);
//Q2 := TThreadQuery.Create(Query2, DataSource2);
end;{ 销毁窗体时销毁线程查询对象 }
procedure TForm1.FormDestroy(Sender: TObject); 
begin 
Q1.Terminate; { 销毁之前终止线程执行 }
Q1.Destroy;
//Q2.Terminate; { 销毁之前终止线程执行 }
//Q2.Destroy;
end;{ 开始线程、继续执行线程、挂起线程 }procedure TForm1.Button1Click(Sender: TObject);
beginif Q1.Suspended then Q1.Resume else Q1.Suspend;end;end.
错误提示
---------------------------
Debugger Exception Notification
---------------------------
Project Project1.exe raised exception class EOleException with message '尚未调用 CoInitialize。'. Process stopped. Use Step or Run to continue.
---------------------------
OK   Help   
---------------------------

解决方案 »

  1.   

    线程Execute里加CoInitialize方法。
      

  2.   

    线程中的adoquery、adoconnection要先初始化CoInitialize。
    调用CoInitialize即可。
      

  3.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, Grids, DBGrids, DB, ADODB,ActiveX;type
      TForm1 = class(TForm)    ADOQuery1: TADOQuery;
        ADOQuery2: TADOQuery;
        DataSource1: TDataSource;
        DataSource2: TDataSource;
        DBGrid1: TDBGrid;
        DBGrid2: TDBGrid;
        Button1: TButton;
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
      TThreadQuery = class(TThread) { 声明线程类 }
      private
       FQuery: TADOQuery; { 线程中的查询组件 }
       FDataSource: TDataSource; { 与查询组件相关的数据感知组件 }
       procedure ConnectDataSource;{ 连接数据查询组件和数据感知组件的方法 }
      protected
       procedure Execute; override;{ 执行线程的方法 }
      public
       constructor Create(Query: TADOQuery;
       DataSource: TDataSource); virtual; { 线程构造器 }
    end;
    var
      Form1: TForm1;
      Q1,Q2:TThreadQuery;
    implementation{$R *.dfm}
    procedure TThreadQuery.ConnectDataSource;
    begin
    FDataSource.DataSet := FQuery;{ 该方法在查询结束后才调用 }
    end;procedure TThreadQuery.Execute;{ 执行线程的方法 }
    begin
    Try
      try//加
        CoInitialize(nil);//加    FQuery.Open; { 打开查询 }
        Synchronize(ConnectDataSource);{ 线程同步 }  finally//加
        CoUninitialize;//加
       end;//加except
    ShowMessage('Query Error'); { 线程异常 }
    end;end;{ 线程查询类的构造器 }
    constructor TThreadQuery.Create(Query: TADOQuery; DataSource: TDataSource);
    begin
    FQuery := Query;
    coInitialize(nil);
    FDataSource := DataSource;
    inherited Create(True);
    FreeOnTerminate := False;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
     Q1 := TThreadQuery.Create(ADOQuery1, DataSource1); Q2 := TThreadQuery.Create(ADOQuery2, DataSource2);end;procedure TForm1.FormDestroy(Sender: TObject);
    begin
     Q1.Terminate; { 销毁之前终止线程执行 }
    Q1.Destroy;
     Q2.Terminate; { 销毁之前终止线程执行 }
     Q2.Destroy;end;procedure TForm1.Button1Click(Sender: TObject);
    begin
     if Q1.Suspended then Q1.Resume else Q1.Suspend;
     if Q2.Suspended then Q2.Resume else Q2.Suspend;
    end;end.
    调用CoInitialize 运行后第一次查询可以,第二次执行查询。错误
    ---------------------------
    Debugger Exception Notification
    ---------------------------
    Project Project1.exe raised exception class EThread with message 'Thread Error: 拒绝访问。 (5)'. Process stopped. Use Step or Run to continue.
    ---------------------------
    OK   Help   
    ---------------------------