unit KqtjUnt;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, ADODB, StdCtrls, Buttons, dxCntner, dxEditor, dxExEdtr,
dxEdLib, ExtCtrls, dxTL, dxDBCtrl, dxDBGrid, ComCtrls,DateUtils, Menus,
DBCtrls, dxDBTLCl, dxGrClms, Grids, DBGridEh, DBCtrlsEh, Mask, ToolWin,activex,
ImgList,ComObj;type
TKqtj_frm = class(TForm)
ADOConnection1: TADOConnection;
MainMenu1: TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
CoolBar1: TCoolBar;
ToolBar1: TToolBar;
ToolButton1: TToolButton;
ToolButton2: TToolButton;
ToolButton3: TToolButton;
sb: TStatusBar;
ToolButton4: TToolButton;
Panel1: TPanel;
Label1: TLabel;
Label4: TLabel;
rq1: TDateTimePicker;
rq2: TDateTimePicker;
procedure ToolButton2Click(Sender: TObject);
procedure ToolButton3Click(Sender: TObject); private
{ Private declarations }
public
{ Public declarations }
end;
type
TDatabaseThread = class(TThread)
private
FADOQuery:TADOQuery;
SQLString:string;
protected
procedure Execute; override;
public
constructor Create(ADO:TADOQuery;S:String); overload;
end;
var
Kqtj_frm: TKqtj_frm;
implementation{$R *.dfm}constructor TDatabaseThread.Create(ADO:TADOQuery;S:String);
begin
FADOQuery:=ADO;
SQLString:=S;
inherited Create(False);
end;procedure TDatabaseThread.Execute;
begin
try
CoInitialize(nil);
fadoquery.Connection :=Kqtj_frm.ADOConnection1;
FreeOnTerminate:=True;
if FADOQuery<>nil then
begin
FADOQuery.Close;
fadoquery.CommandTimeout :=60000;
FADOQuery.SQL.Clear;
FADOQuery.SQL.Add(SQLString);
FADOQuery.ExecSQL;
end;
if Terminated then //线程怎么好象处理不完了啊。一直等着也没有下边的提示。
begin
Kqtj_frm.sb.Panels[1].Text :='数据处理完成';
Kqtj_frm.sb.refresh;
exit;
end;
finally
CoUninitialize;
FreeAndNil(FADOQuery);
end;
end;
procedure TKqtj_frm.ToolButton2Click(Sender: TObject);
begin
self.close;
end;procedure TKqtj_frm.ToolButton3Click(Sender: TObject);
var query:tadoquery;
begin
//开始线程处理
query:=tadoquery.Create(nil);
TDatabaseThread.Create(query,'kqcalc '''+datetostr(rq1.date)+''','''+datetostr(rq2.date)+''' ');
end;
end.问题。1.线程结束后没有到上边的提示
2.如果用户强制结束线程如何写代码
没有用过线程,请大家指点一下。多谢。
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, ADODB, StdCtrls, Buttons, dxCntner, dxEditor, dxExEdtr,
dxEdLib, ExtCtrls, dxTL, dxDBCtrl, dxDBGrid, ComCtrls,DateUtils, Menus,
DBCtrls, dxDBTLCl, dxGrClms, Grids, DBGridEh, DBCtrlsEh, Mask, ToolWin,activex,
ImgList,ComObj;type
TKqtj_frm = class(TForm)
ADOConnection1: TADOConnection;
MainMenu1: TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
CoolBar1: TCoolBar;
ToolBar1: TToolBar;
ToolButton1: TToolButton;
ToolButton2: TToolButton;
ToolButton3: TToolButton;
sb: TStatusBar;
ToolButton4: TToolButton;
Panel1: TPanel;
Label1: TLabel;
Label4: TLabel;
rq1: TDateTimePicker;
rq2: TDateTimePicker;
procedure ToolButton2Click(Sender: TObject);
procedure ToolButton3Click(Sender: TObject); private
{ Private declarations }
public
{ Public declarations }
end;
type
TDatabaseThread = class(TThread)
private
FADOQuery:TADOQuery;
SQLString:string;
protected
procedure Execute; override;
public
constructor Create(ADO:TADOQuery;S:String); overload;
end;
var
Kqtj_frm: TKqtj_frm;
implementation{$R *.dfm}constructor TDatabaseThread.Create(ADO:TADOQuery;S:String);
begin
FADOQuery:=ADO;
SQLString:=S;
inherited Create(False);
end;procedure TDatabaseThread.Execute;
begin
try
CoInitialize(nil);
fadoquery.Connection :=Kqtj_frm.ADOConnection1;
FreeOnTerminate:=True;
if FADOQuery<>nil then
begin
FADOQuery.Close;
fadoquery.CommandTimeout :=60000;
FADOQuery.SQL.Clear;
FADOQuery.SQL.Add(SQLString);
FADOQuery.ExecSQL;
end;
if Terminated then //线程怎么好象处理不完了啊。一直等着也没有下边的提示。
begin
Kqtj_frm.sb.Panels[1].Text :='数据处理完成';
Kqtj_frm.sb.refresh;
exit;
end;
finally
CoUninitialize;
FreeAndNil(FADOQuery);
end;
end;
procedure TKqtj_frm.ToolButton2Click(Sender: TObject);
begin
self.close;
end;procedure TKqtj_frm.ToolButton3Click(Sender: TObject);
var query:tadoquery;
begin
//开始线程处理
query:=tadoquery.Create(nil);
TDatabaseThread.Create(query,'kqcalc '''+datetostr(rq1.date)+''','''+datetostr(rq2.date)+''' ');
end;
end.问题。1.线程结束后没有到上边的提示
2.如果用户强制结束线程如何写代码
没有用过线程,请大家指点一下。多谢。
Create方法可以重载,主要为了接收外面来的参数,在其中还可以指定onterminate参数(指定terminate时调用那个方法)
excute是关键,要自己写,如果你的线程只是干件事就完了,那么ecxcute结束后,系统会自动调用terminate将线程结束。我们是设置死循环让线程一直存在,除非我们调用terminate。调用线程:create,resume,suspend,terminate我们的ado是放在一个数据模块里面,线程unit use数据模块,然后在线程的excute方法里面用ado东东