DBGridEh通过DataSource关联了ADOQUERY,线程中打开ADOQUERY是否安全? 打开窗口的时候,启动一个线程,这个线程就是将ADOQUERY打开,让DbGridEh显示数据。这样可以减少显示窗口的时间,不知道是否线程安全?欢迎用过的朋友指点一下,多谢 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 如果你打开完成后再去主线程里关联query和datasource,我想是安全的。 本人写的一个查询线程测试的代码,给你参考下: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. 入门者求助一个简单问题 请教接口封装原则的问题 這個問題也許很容易,但我就是弄不懂,請各位進來看看. TAdoConnection的错误,请高手指点。急!!! 动态控件数组的事件处理程序怎么写呀,在线等,急 求救!各位高手,有谁做过人力资源的绩效考核系统? 怎么获取打印端口(LPT)缺纸状态 天啊!!!我帮了你们这么多!!你们能不能帮帮我啊!!!!!!急啊!!!各位高手!!!! 关于delphi中合并dll的问题 天那,你为什么这么对我!!!谁偷走了我的参与分? com加载项,控制EXCEL事件,为何VB能做到,DELPHI做不到呢? 自制组件添加事件的问题
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.