下面这段代码执行正常,但执行完后前台结果集一显示马上就关闭了
如果不创建FAdoCon连接,而用DataSet原来的连接,则没问题,请指点
我是按一个线程使用一个连接的原则做的
另外,想问一下,Execute过程中的
Synchronize(ConnectDataSource)这句话是否多余,
我注释这句话后感知控件也能显示,谢谢unit UQueryThread;
interface
uses Windows, Classes, ADODB, DB, ActiveX, Messages, SysUtils, Dialogs,
  Forms, ComCtrls;
const
  WM_MYTHREAD_DONE = WM_USER + 1024;
type
  TQueryThread = class(TThread)
  private
    FOwnerHandle: HWND;
    FAdoCon: TAdoConnection;
    FDataSet: TAdoDataSet;
    FDataSource: TDataSource;
    procedure ConnectDataSource;
    procedure ThreadsDoned(Sender: TObject);
  protected
    procedure Execute; override;
  public
    constructor Create(Suspended: Boolean; OwnerHandle: HWND; sConStr: String;
                DataSet: TAdoDataSet; DataSource: TDataSource);
    destructor Destroy; override;
  end;
implementation
procedure TQueryThread.ConnectDataSource;
begin
   FDataSource.DataSet := FDataSet;
end;
constructor TQueryThread.Create(Suspended: Boolean;
                                OwnerHandle: HWND;
                                sConStr: String;
                                DataSet: TAdoDataSet;
                                DataSource: TDataSource);
begin
  FOwnerHandle := OwnerHandle;
  FAdoCon := TAdoConnection.Create(nil);
  FAdoCon.LoginPrompt := False;
  FAdoCon.ConnectionString := sConStr;
  FDataSet := DataSet;
  FDataSet.Connection := FAdoCon;
  FDataSource := DataSource;
  try
    inherited Create(Suspended);
    OnTerminate := ThreadsDoned;
    if Suspended then
      Resume;
  except
    raise;
  end;
end;
procedure TQueryThread.Execute;
begin
  CoInitialize(nil);
  FreeOnTerminate := True;
  if Terminated then
  begin
    FDataSet.Close;
    Exit;
  end;
  try
    try
      with FDataSet do
      begin
        Close;
        Open;
      end;
      Synchronize(ConnectDataSource);
    except
      FDataSet.Close;
    end;
  finally
    CoUnInitialize;
  end;
end;
procedure TQueryThread.ThreadsDoned(Sender: TObject);
begin
  PostMessage(FOwnerHandle, WM_MYTHREAD_DONE, 0, 0);
end;
destructor TQueryThread.Destroy;
begin
  FAdoCon.Connected := False;
  FreeAndNil(FAdoCon);
  inherited Destroy;
end;
end.