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.
我的程序是备份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.
解决方案 »
- 人民币100元求解,工行转帐,现场结贴。
- 关于外键,结了个没解决的帖,还是不信解决不了我这个新手的疑惑
- 如何动态设置纸张的长度呢?
- 请教:Rave中的红色矩形内的打印区域与Region打印区域有什么区别?????
- 调用DLL提示“无效窗口句柄”,为何?详情请进!
- 共享串口?
- 愚人节发短信,请到博虎网:www.pohoo.com
- 从网上下载一些源代码运行是经常提示File notfound :syshook.dcu 之类的,这是为什么?
- 调用delphi的dll运行正常,退出时调用完后就出现“0x00000000 处未处理的异常
- sql的简单问题!
- 如何获取U盘插入的事件和盘符?
- 读取swf文件中影片的大小
Backup_F.cmd1.Execute; 這個時候工作交給ADO去做了。所以立即停止不行的。 建議弄一個單獨的備份程序,如果確實覺得慢,可翠直接KILL掉進程,這樣也不會影響你正常系統的運行
试试吧使用ClientDataSet的话就比较方便, 可以随时终止, 不过服务器那块是肯定还在运作的
在Create函数中加
public
constructor Create;constructor Tmythrd.Create;
begin
FreeOnTerminate := True;
inherited Create(False);
end;就这样
1、在本线程中处理WM_KEYDOWN消息或主线程中响应KeyDown事件,以便按下Esc键时处理其中止动作
2、在本线程中加语句:
if Terminated then
Terminate;
但是由于开始备份时,备份的过程是由SQL数据库做的,是作为一个事务来处理的.所以前台的DELPHI对它是无能为力的.就算是杀掉线程,备份过程也是要做的.
在这种情况下,如果在终止备份过程,只能有一个办法,就是向SQL数据库发出终止备份事务的请求,具体方法以前做过,现在想不起来了,然后前台的DELPHI线程就停止了.