100分,我这样子创建的线程,用什么办法立即终止呢?
我的程序是备份sql数据库的。我想可以在备份时停止。调用线程的时候是这样子调用的:
MyThread.Create(false);请问如何能立即终止备份线程。线程单元的代码如下:unit Thread_U;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, StdCtrls, Buttons, Mask, ExtCtrls, DB, ADODB,IniFiles,Backup_U;type
  MyThread = class(TThread)
  private
    { Private declarations }
  protected
    procedure Execute; override;
  end;implementation{ Important: Methods and properties of objects in visual components can only be
  used in a method called using Synchronize, for example,      Synchronize(UpdateCaption);  and UpdateCaption could look like,    procedure MyThread.UpdateCaption;
    begin
      Form1.Caption := 'Updated in a thread';
    end; }{ MyThread }procedure MyThread.Execute;
begin
  case 
    Application.MessageBox('备份一些较大的数据库时需要耗费' + #13 + '一定的时间。请问还要继续吗?',
    '询问', MB_YESNO + MB_ICONINFORMATION) of
    IDYES:
      begin
        IF (Backup_F.edt1.Text = '') or (Backup_F.cbb1.Text = '') then
        begin
          Application.MessageBox('某些参数不能为空,请输入完整。', '参数错误', MB_OK + MB_ICONSTOP);
        end else
        begin
          try
            Backup_F.btn4.Enabled := True;
            Backup_F.cbb1.Enabled := False;
            Backup_F.edt1.Enabled := False;
            Backup_F.btn5.Enabled := False;
            Backup_F.btn3.Enabled := False;
            
            Backup_F.lbl7.Caption := '备分正在进行,请耐心等侯,并不要执行其他操作...';
            Backup_F.lbl7.Visible := True;
            
            Backup_F.cmd1.CommandText:='BACKUP DATABASE ' + Backup_F.cbb1.Text + ' to disk= ''' + Backup_F.edt1.Text + '''';
            Backup_F.cmd1.Execute;            Backup_F.lbl7.Visible := False;
            
            Application.MessageBox('所选择的数据库已成功备份到您指定的文件中。' , '成功',MB_OK + MB_ICONINFORMATION);            Backup_F.btn4.Enabled := False;
            Backup_F.cbb1.Enabled := True;
            Backup_F.edt1.Enabled := True;
            Backup_F.btn5.Enabled := True;
            Backup_F.btn3.Enabled := True;
            
            MyIniFile.WriteString('Backup','Database',Backup_F.cbb1.Text);
            MyIniFile.WriteString('Backup','FilePath',Backup_F.edt1.Text);
          except
            Application.MessageBox('未能成功执行您指定的数据库备份操作,请重试。', '失败', MB_OK + MB_ICONSTOP);
          end;
        end;
      end;
  end;
end;end.

解决方案 »

  1.   

    Execute运行结束就自动结束线程了呀
      

  2.   

    没办法中途停止。 Backup_F.cmd1.Execute;时候很耗时,单语句,也没办法响应系统的其他消息。只能等运行结束才可以。
      

  3.   

    Backup_F.cmd1.CommandText:='BACKUP DATABASE ' + Backup_F.cbb1.Text + ' to disk= ''' + Backup_F.edt1.Text + '''';
                Backup_F.cmd1.Execute; 這個時候工作交給ADO去做了。所以立即停止不行的。 建議弄一個單獨的備份程序,如果確實覺得慢,可翠直接KILL掉進程,這樣也不會影響你正常系統的運行
      

  4.   

    备份的过程实际上是SQLServer执行的,你的程序仅仅是等待一个结果。你杀死了线程后仅仅结果没有得到,但SQLServer仍然在工作。
      

  5.   

    光是一句备份的就要N秒...哪怕你terminate了,也要这句备份的执行完以后再去检查这个标志。
      

  6.   

    ADO有一个事件, 叫 OnFetchXXXXX的, 忘记了, 只要把ADO的某个属性设置一下, 使用异步的方式, 这个方法会在每领到一份数据包就会调用一次, 利用这个来退出查询也可以的, 大概.... 
    试试吧使用ClientDataSet的话就比较方便, 可以随时终止, 不过服务器那块是肯定还在运作的
      

  7.   

    重载线程Create函数
    在Create函数中加
    public
    constructor Create;constructor Tmythrd.Create;
    begin
      FreeOnTerminate := True;
      inherited Create(False);
    end;就这样
      

  8.   

    说得很有道理,是没办法马上停止的,就算点Close关闭程序也会报内存错误,所以必须等执行完后才可以。
      

  9.   

    建议做如下修改:
    1、在本线程中处理WM_KEYDOWN消息或主线程中响应KeyDown事件,以便按下Esc键时处理其中止动作
    2、在本线程中加语句:
       if Terminated then
        Terminate;
         
      

  10.   

    多线程里使用 Application.MessageBox() 使得多线程一点意义也没有
      

  11.   

    这样把备份过程放在线程中的效果和使用普通的过程的效果是一样,只不过,放在线程中的话,可以将该线程压在后台运行,不影响前台的操作,这样的方法是可以的.
    但是由于开始备份时,备份的过程是由SQL数据库做的,是作为一个事务来处理的.所以前台的DELPHI对它是无能为力的.就算是杀掉线程,备份过程也是要做的.
    在这种情况下,如果在终止备份过程,只能有一个办法,就是向SQL数据库发出终止备份事务的请求,具体方法以前做过,现在想不起来了,然后前台的DELPHI线程就停止了.