unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids, DBGrids, DB, ADODB,ActiveX;type
TForm1 = class(TForm) ADOQuery1: TADOQuery;
ADOQuery2: TADOQuery;
DataSource1: TDataSource;
DataSource2: TDataSource;
DBGrid1: TDBGrid;
DBGrid2: TDBGrid;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
TThreadQuery = class(TThread) { 声明线程类 }
private
FQuery: TADOQuery; { 线程中的查询组件 }
FDataSource: TDataSource; { 与查询组件相关的数据感知组件 }
procedure ConnectDataSource;{ 连接数据查询组件和数据感知组件的方法 }
protected
procedure Execute; override;{ 执行线程的方法 }
public
constructor Create(Query: TADOQuery;
DataSource: TDataSource); virtual; { 线程构造器 }
end;
var
Form1: TForm1;
Q1,Q2:TThreadQuery;
implementation{$R *.dfm}
procedure TThreadQuery.ConnectDataSource;
begin
FDataSource.DataSet := FQuery;{ 该方法在查询结束后才调用 }
end;procedure TThreadQuery.Execute;{ 执行线程的方法 }
begin
Try
try//加
CoInitialize(nil);//加 FQuery.Open; { 打开查询 }
Synchronize(ConnectDataSource);{ 线程同步 } finally//加
CoUninitialize;//加
end;//加except
ShowMessage('Query Error'); { 线程异常 }
end;end;{ 线程查询类的构造器 }
constructor TThreadQuery.Create(Query: TADOQuery; DataSource: TDataSource);
begin
FQuery := Query;
coInitialize(nil);
FDataSource := DataSource;
inherited Create(True);
FreeOnTerminate := False;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
Q1 := TThreadQuery.Create(ADOQuery1, DataSource1); Q2 := TThreadQuery.Create(ADOQuery2, DataSource2);end;procedure TForm1.FormDestroy(Sender: TObject);
begin
Q1.Terminate; { 销毁之前终止线程执行 }
Q1.Destroy;
Q2.Terminate; { 销毁之前终止线程执行 }
Q2.Destroy;end;procedure TForm1.Button1Click(Sender: TObject);
begin
if Q1.Suspended then Q1.Resume else Q1.Suspend;
if Q2.Suspended then Q2.Resume else Q2.Suspend;
end;end. 运行后第一次执行(Button1Click)查询可以,第二次执行(Button1Click)查询。错误
---------------------------
Debugger Exception Notification
---------------------------
Project Project1.exe raised exception class EThread with message 'Thread Error: 拒绝访问。 (5)'. Process stopped. Use Step or Run to continue.
---------------------------
OK Help
---------------------------
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids, DBGrids, DB, ADODB,ActiveX;type
TForm1 = class(TForm) ADOQuery1: TADOQuery;
ADOQuery2: TADOQuery;
DataSource1: TDataSource;
DataSource2: TDataSource;
DBGrid1: TDBGrid;
DBGrid2: TDBGrid;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
TThreadQuery = class(TThread) { 声明线程类 }
private
FQuery: TADOQuery; { 线程中的查询组件 }
FDataSource: TDataSource; { 与查询组件相关的数据感知组件 }
procedure ConnectDataSource;{ 连接数据查询组件和数据感知组件的方法 }
protected
procedure Execute; override;{ 执行线程的方法 }
public
constructor Create(Query: TADOQuery;
DataSource: TDataSource); virtual; { 线程构造器 }
end;
var
Form1: TForm1;
Q1,Q2:TThreadQuery;
implementation{$R *.dfm}
procedure TThreadQuery.ConnectDataSource;
begin
FDataSource.DataSet := FQuery;{ 该方法在查询结束后才调用 }
end;procedure TThreadQuery.Execute;{ 执行线程的方法 }
begin
Try
try//加
CoInitialize(nil);//加 FQuery.Open; { 打开查询 }
Synchronize(ConnectDataSource);{ 线程同步 } finally//加
CoUninitialize;//加
end;//加except
ShowMessage('Query Error'); { 线程异常 }
end;end;{ 线程查询类的构造器 }
constructor TThreadQuery.Create(Query: TADOQuery; DataSource: TDataSource);
begin
FQuery := Query;
coInitialize(nil);
FDataSource := DataSource;
inherited Create(True);
FreeOnTerminate := False;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
Q1 := TThreadQuery.Create(ADOQuery1, DataSource1); Q2 := TThreadQuery.Create(ADOQuery2, DataSource2);end;procedure TForm1.FormDestroy(Sender: TObject);
begin
Q1.Terminate; { 销毁之前终止线程执行 }
Q1.Destroy;
Q2.Terminate; { 销毁之前终止线程执行 }
Q2.Destroy;end;procedure TForm1.Button1Click(Sender: TObject);
begin
if Q1.Suspended then Q1.Resume else Q1.Suspend;
if Q2.Suspended then Q2.Resume else Q2.Suspend;
end;end. 运行后第一次执行(Button1Click)查询可以,第二次执行(Button1Click)查询。错误
---------------------------
Debugger Exception Notification
---------------------------
Project Project1.exe raised exception class EThread with message 'Thread Error: 拒绝访问。 (5)'. Process stopped. Use Step or Run to continue.
---------------------------
OK Help
---------------------------
解决方案 »
- DELPHI 如何来取得数据是否真正的有打印
- 求个算法与思路。帮忙看看。谢谢
- DELPHI的执行文件为什么在XP系统上,在上传数据到服务器时,一动就会白屏?有何解决办法?
- 家里刚装好宽带,偶会有更多的时间来到这里,兴奋啊.......散分!!!!!!!!
- 为什么它说我的字段不存在?
- 系统件快速开发解决方案 —系统转系统件方案
- 大家给指条路吧?(高分请教)
- 我做的ActiveX Dll for asp程序注册调用后就被缩住了,无法删除和重新编译
- 请各位看看我这段随机出题的代码,怎么老是有重复。。。谢谢
- 取得CPU的ID号后出现了错误!
- 100分求delphi通用查询模块
- DbGrid如何让字段计时(按秒),几百条数据列表,怎样做到每条数据自动计时按秒显示而占用最少资源?
begin
ADOQuery1.SQL.Text:='select * from zd_ks' ;
ADOQuery2.SQL.Text:='select * from zd_ry' ;
Q1 := TThreadQuery.Create(ADOQuery1, DataSource1); Q2 := TThreadQuery.Create(ADOQuery2, DataSource2);
if Q1.Suspended then Q1.Resume else Q1.Suspend;
if Q2.Suspended then Q2.Resume else Q2.Suspend;
end;
这样就可以了重复 查询 不知道为什么