打开窗口的时候,启动一个线程,这个线程就是将ADOQUERY打开,让DbGridEh显示数据。这样可以减少显示窗口的时间,不知道是否线程安全?欢迎用过的朋友指点一下,多谢

解决方案 »

  1.   

    如果你打开完成后再去主线程里关联query和datasource,我想是安全的。
      

  2.   

    本人写的一个查询线程测试的代码,给你参考下:
    unit TestThreadMainForm;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, Grids, DBGrids, DB, ADODB,TQueryThreadUnit, ComCtrls,
      DBGridEh;type
      TForm1 = class(TForm)
        ADODataSet1: TADODataSet;
        DataSource1: TDataSource;
        Button1: TButton;
        StatusBar1: TStatusBar;
        DBGridEh1: TDBGridEh;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    begin  //CoInitialize(nil);
      try
      TQueryThread.Create(ADODataset1,DataSource1,StatusBar1);
      StatusBar1.SimpleText := '請等待,正在打開數據表......';
      StatusBar1.SimplePanel := True;
      finally
       //CoUninitialize;
      end;
      //ADODataSet1.Open;
    end;end.unit TQueryThreadUnit;interfaceuses
      Classes,ADODB,DB,ActiveX,ComCtrls;type
      TQueryThread = class(TThread)
      private
        FDataSet :TADODataSet;
        FDataSource :TDataSource;
        FStatusBar :TStatusBar;
        procedure HookUpUI;
        { Private declarations }
      protected
        procedure Execute; override;
      public
        constructor Create(ADataSet:TADODataSet;ADataSource:TDataSource;AStatusBar:TStatusBar);virtual;
      end;implementation{ TQueryThread }
    constructor TQueryThread.Create(ADataSet:TADODataSet;ADataSource:TDataSource;AStatusBar:TStatusBar);
    begin
      inherited Create(True);
      FDataSet := ADataSet;
      FDataSource := ADataSource;
      FStatusBar := AStatusBar;
      FreeOnTerminate := True;
      Resume;
    end;procedure TQueryThread.Execute;
    begin
      { Place thread code here }
      CoInitialize(nil);
      try
        if not FDataSet.Active then FDataSet.Open;
        Synchronize(HookUpUI);
      finally
       CoUninitialize;
      end;
    end;procedure TQueryThread.HookUpUI;
    begin
      FDataSource.DataSet := FDataSet;
      FStatusBar.SimpleText := '已經打開數據表!';
    end;
    end.program TestThreadQuery;uses
      Forms,
      TestThreadMainForm in 'TestThreadMainForm.pas' {Form1},
      TQueryThreadUnit in 'TQueryThreadUnit.pas';{$R *.res}begin
      Application.Initialize;
      Application.CreateForm(TForm1, Form1);
      Application.Run;
    end.