下面这段代码执行正常,但执行完后前台结果集一显示马上就关闭了
如果不创建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.
如果不创建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.
改成FAdoCon := DataSet.Connection;
行不
Synchronize(ConnectDataSource),是同步调用里面的过程