读书人

DBGridEh通过DataSource关联了ADOQUER

发布时间: 2012-03-31 13:13:26 作者: rapoo

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

[解决办法]
如果你打开完成后再去主线程里关联query和datasource,我想是安全的。
[解决办法]
本人写的一个查询线程测试的代码,给你参考下:
unit TestThreadMainForm;

interface

uses
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;

interface

uses
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.

读书人网 >.NET

热点推荐