unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, DB, ADODB, Grids, DBGrids;type
  TForm1 = class(TForm)
    ADOQuery1: TADOQuery;
    ADOQuery2: TADOQuery;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    DBGrid1: TDBGrid;
    DBGrid2: TDBGrid;
    DataSource1: TDataSource;
    DataSource2: TDataSource;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;  TTestThread=class(TThread)
  private
    FNum:Integer;
   FADOQuy:TADOQuery;
  protected
     procedure Execute;override;
  public
     constructor Create(ADOQuy:TADOQuery;Num:integer);
  end;var
  Form1: TForm1;
  test1,test2:TTestThread;
implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
beginend;{ TTestThread }constructor TTestThread.Create(ADOQuy: TADOQuery; Num: integer);
begin
  inherited Create(false);
   FADOQuy:=ADOQuy;
   FNum:=Num;
  //FreeOnTerminate确定程序员是否负责撤消该线程。
  //如果该属性为True,VCL将在该线程终止时自动撤消线程对象。它的缺省值为False。
  FreeOnTerminate:=True;
end;procedure TTestThread.Execute;
var
  Int_i:Integer;
begin
  inherited;
  for Int_i:=0 to FNum do
  begin
    FADOQuy.Append;
    FADOQuy.FieldByName('t1').AsInteger:=Int_i;
    FADOQuy.FieldByName('t2').AsInteger:=Int_i;
    FADOQuy.Post;
  end;
end;procedure TForm1.Button1Click(Sender: TObject);
begin
  test1:=TTestThread.Create(ADOQuery1,10000);
  test2:=TTestThread.Create(ADOQuery2,80000);
end;procedure TForm1.Button2Click(Sender: TObject);
begin
  test1.suspend;
  test2.suspend;
end;procedure TForm1.Button3Click(Sender: TObject);
begin
  test1.resume;
  //test2.resume;
end;end.运行一会总出错,不是是什么原因

解决方案 »

  1.   

    //我的测试程序, 没有问题, 可以同步显示新添加的数据
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ExtCtrls, DB, ADODB, Grids, DBGrids;type
      TForm1 = class(TForm)
        DataSource1: TDataSource;
        DBGrid1: TDBGrid;
        ADOQuery1: TADOQuery;
        ADOConnection1: TADOConnection;
        Button1: TButton;
        Button2: TButton;
        Button3: TButton;
        procedure RadioGroup1Click(Sender: TObject);
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure Button3Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;  TTestThread=class(TThread)
      private
        FNum:Integer;
       FADOQuy:TADOQuery;
        procedure AddData;
      protected
         procedure Execute;override;
      public
         constructor Create(ADOQuy:TADOQuery;Num:integer);
      end;var
      Form1: TForm1;
      test1,test2:TTestThread;
    implementation{$R *.dfm}
    { TTestThread }constructor TTestThread.Create(ADOQuy: TADOQuery; Num: integer);
    begin
      inherited Create(false);
       FADOQuy:=ADOQuy;
       FNum:=Num;
      //FreeOnTerminate确定程序员是否负责撤消该线程。
      //如果该属性为True,VCL将在该线程终止时自动撤消线程对象。它的缺省值为False。
      FreeOnTerminate:=True;
    end;procedure TTestThread.AddData;
    var
      Int_i:Integer;
    begin
      for Int_i:=0 to FNum do
      begin
        FADOQuy.Append;
        Sleep(1);
        FADOQuy.FieldByName('A1').AsString := FormatDateTime('YYYY_MM_DD_HH_NN_SS_ZZZ', Now);  //插入时间是为了避免插入重复的数据出错
        FADOQuy.FieldByName('A2').AsString := FormatDateTime('YYYY_MM_DD_HH_NN_SS_ZZZ', Now);
        FADOQuy.Post;
      end;
    end;procedure TTestThread.Execute;begin
      inherited;
      Synchronize(AddData);  //如过你的Adoquery1关联了主线程中的数据显示控件(如DbGrid)
               //必须得用Synchronize同步函数
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      test1:=TTestThread.Create(ADOQuery1,10);
    //  test2:=TTestThread.Create(ADOQuery2,80000);
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
      test1.suspend;
    //  test2.suspend;
    end;procedure TForm1.Button3Click(Sender: TObject);
    begin
      test1.resume;
    end;end.