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.如果用户强制结束线程如何写代码
没有用过线程,请大家指点一下。多谢。

解决方案 »

  1.   

    Terminated是线程的一个属性,你不能这么写的,在Execute过程中他一直是False的,当然就不会执行你的那部分代码了,你可以去到那个判断条件,线程执行完所有代码后自动退出注销的
      

  2.   

    对于线程执行代码中无循环的情况,只能取线程对象的句柄,用API函数强制结束函数。主线程才有消息循环,不能在线程直接设置控件,可用消息或者用线程的同步方法。
      

  3.   

    我们刚刚做了线程的程序,也是封装了aod,很简单(我是指我们初学者写得简单),只起一个线程,我的体会是线程主要关注几个方法:
    Create方法可以重载,主要为了接收外面来的参数,在其中还可以指定onterminate参数(指定terminate时调用那个方法)
    excute是关键,要自己写,如果你的线程只是干件事就完了,那么ecxcute结束后,系统会自动调用terminate将线程结束。我们是设置死循环让线程一直存在,除非我们调用terminate。调用线程:create,resume,suspend,terminate我们的ado是放在一个数据模块里面,线程unit use数据模块,然后在线程的excute方法里面用ado东东