多线程查询 ( 积分: 50 )

  • 主题发起人 主题发起人 DELPHI.X
  • 开始时间 开始时间
D

DELPHI.X

Unregistered / Unconfirmed
GUEST, unregistred user!
TThreadQuery = class(TThread) { 声明线程类 }
private
 FQuery: TQuery;
{ 线程中的查询组件 }
 FDataSource: TDataSource;
{ 与查询组件相关的数据感知组件 }
 procedure ConnectDataSource;{ 连接数据查询组件和数据感知组件的方法 }
protected
 procedure Execute;
override;{ 执行线程的方法 }
public
 constructor Create(Query: TQuery;
 DataSource: TDataSource);
virtual;
{ 线程构造器 }
end;

var
Form1: TForm1;
Q1, { 线程查询对象1 }
Q2: TThreadQuery;
{ 线程查询对象2 }
implementation
{$R *.DFM}
{ TThreadQuery类的实现 }
{ 连接数据查询组件和数据感知组件}
procedure TThreadQuery.ConnectDataSource;
begin
 FDataSource.DataSet := FQuery;{ 该方法在查询结束后才调用 }
end;

procedure TThreadQuery.Execute;{ 执行线程的方法 }
begin
try
 FQuery.Open;
{ 打开查询 }
 Synchronize(ConnectDataSource);{ 线程同步 }
except
 ShowMessage('Query Error');
{ 线程异常 }
end;
end;

{ 线程查询类的构造器 }
constructor TThreadQuery.Create(Query: TQuery;
DataSource: TDataSource);
begin
 FQuery := Query;
 FDataSource := DataSource;
 inherited Create(True);
 FreeOnTerminate := False;
end;

Q1 := TThreadQuery.Create(Query1, DataSource1);后
Execure过程不自动执行是怎么回事?
 
TThreadQuery = class(TThread) { 声明线程类 }
private
 FQuery: TQuery;
{ 线程中的查询组件 }
 FDataSource: TDataSource;
{ 与查询组件相关的数据感知组件 }
 procedure ConnectDataSource;{ 连接数据查询组件和数据感知组件的方法 }
protected
 procedure Execute;
override;{ 执行线程的方法 }
public
 constructor Create(Query: TQuery;
 DataSource: TDataSource);
virtual;
{ 线程构造器 }
end;

var
Form1: TForm1;
Q1, { 线程查询对象1 }
Q2: TThreadQuery;
{ 线程查询对象2 }
implementation
{$R *.DFM}
{ TThreadQuery类的实现 }
{ 连接数据查询组件和数据感知组件}
procedure TThreadQuery.ConnectDataSource;
begin
 FDataSource.DataSet := FQuery;{ 该方法在查询结束后才调用 }
end;

procedure TThreadQuery.Execute;{ 执行线程的方法 }
begin
try
 FQuery.Open;
{ 打开查询 }
 Synchronize(ConnectDataSource);{ 线程同步 }
except
 ShowMessage('Query Error');
{ 线程异常 }
end;
end;

{ 线程查询类的构造器 }
constructor TThreadQuery.Create(Query: TQuery;
DataSource: TDataSource);
begin
 FQuery := Query;
 FDataSource := DataSource;
 inherited Create(True);
 FreeOnTerminate := False;
end;

Q1 := TThreadQuery.Create(Query1, DataSource1);后
Execure过程不自动执行是怎么回事?
 
constructor TThread.Create(CreateSuspended: Boolean);

看好了 这个是thread类的构造函数
你写构造应该要有CreateSuspended 这个参数 ,这个参数的意思是:是否创建一个已经被阻塞的线称;如果为true 线程一创建就会被阻塞,你现在等于说把人家的构造参数pass过去了,而且 你还是重新声明构造,没有执行原来的,竟然没有弹出句柄错误么 [:)]
 
建议:
构造函数中
FQuery := Query;
之前
应该加一句
inherited Create(false);
应该就能达到你要的效果
 
接受答案了.
 
后退
顶部