问了半天,还没解决,有人说用线程,可有问题,不要用application.process..,这个没用,有好方法吗,谢谢大家了,讲详细点,我菜哦
var
Form1: TForm1;
Q1: TThreadQuery; { 线程查询对象1 } 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: ToraQuery; DataSource: ToraDataSource);
begin
FQuery := Query;
FDataSource := DataSource;
inherited Create(True);
FreeOnTerminate := False;
end; { 创建窗体时创建线程查询对象 }
procedure TForm1.FormCreate(Sender: TObject);
begin
Q1 := TThreadQuery.Create(Query1, DataSource1);
end; { 销毁窗体时销毁线程查询对象 }
procedure TForm1.FormDestroy(Sender: TObject);
begin
Q1.Terminate; { 销毁之前终止线程执行 }
Q1.Destroy;
end; { 开始线程、继续执行线程、挂起线程 }
procedure TForm1.BtnGoPauseClick(Sender: TObject);
begin
if Q1.Suspended then Q1.Resume else Q1.Suspend;
end; end.
上面是看人家的程序,还是中断不了,唉??????挂起时候说句柄不能访问?
救命
var
Form1: TForm1;
Q1: TThreadQuery; { 线程查询对象1 } 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: ToraQuery; DataSource: ToraDataSource);
begin
FQuery := Query;
FDataSource := DataSource;
inherited Create(True);
FreeOnTerminate := False;
end; { 创建窗体时创建线程查询对象 }
procedure TForm1.FormCreate(Sender: TObject);
begin
Q1 := TThreadQuery.Create(Query1, DataSource1);
end; { 销毁窗体时销毁线程查询对象 }
procedure TForm1.FormDestroy(Sender: TObject);
begin
Q1.Terminate; { 销毁之前终止线程执行 }
Q1.Destroy;
end; { 开始线程、继续执行线程、挂起线程 }
procedure TForm1.BtnGoPauseClick(Sender: TObject);
begin
if Q1.Suspended then Q1.Resume else Q1.Suspend;
end; end.
上面是看人家的程序,还是中断不了,唉??????挂起时候说句柄不能访问?
救命
1.这个语句要为select
2.adodataset设为异步执行方式!
adodataset1.ExecuteOptions:= [eoAsyncFetchNonBlocking]
3。在
procedure TForm1.ADODataSet1FetchProgress(DataSet: TCustomADODataSet;
Progress, MaxProgress: Integer; var EventStatus: TEventStatus);
begin
if ...then //用一变量表示用户是否要求停止
dataset.close;
end;
对上面的一点补充,
上面的语句虽然可以停止查询,但是查询到的结果也没了,
下面用一个变通的方法可以保存查询结果
增加一个adodataset2,
procedure TForm1.ADODataSet1FetchProgress(DataSet: TCustomADODataSet;
Progress, MaxProgress: Integer; var EventStatus: TEventStatus);
begin
if ...then //用一变量表示用户是否要求停止
begin
adodataset2.recordset:=dataset.recordset;//保存查询结果
dataset.close; //停止查询
end;
end;