标题: Delphi中实现多线程同步查询 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;end. 这段代码里面Query1语句,是不是固定不变的,如果能改变在那一行能体现出来
 

解决方案 »

  1.   

    constructor Create(Query: TQuery;
                           DataSource: TDataSource); virtual; { 线程构造器 }
    我怎么觉得最后的 virtual 应该去掉啊?本人太菜,所以有点疑问!这好像可以改变query1语句:
    procedure TForm1.BtnGoPauseClick(Sender: TObject);
    begin
      if Q1.Suspended then 
      begin
       Q1.Resume 
      try 
     with query1 do
       begin
       close;
     sql.clear;
     sql.add(inputbox('请输入SQL语句:','提示',''));
     open;
     end;
    except
      showmessage('SQL输入错误!');
     end;
      end
       else Q1.Suspend;
      if Q2.Suspended then Q2.Resume else Q2.Suspend;
    end;