请问应该怎么终止一个线程啊?只有这么多分了,已经倾家荡产了!!!!(17分)

  • 主题发起人 主题发起人 Flying_zyz
  • 开始时间 开始时间
F

Flying_zyz

Unregistered / Unconfirmed
GUEST, unregistred user!
按下按钮A,创建该一个线程:(相当于开始拷贝文件)
aThread:=TMyThread.Create(false);
///////////////////////////////////////////////
线程函数如下:(拷贝文件)
procedure TMyThread.Execute;
var
lpFileOp: TSHFileOpStruct;
begin
lpFileOp.Wnd := Application.Handle;
lpFileOp.wFunc := FO_COPY;
lpFileOp.pFrom := PChar('...'+ #0#0);
lpFileOp.pTo := PChar('...'+ #0#0);
lpFileOp.fFlags := FOF_NOCONFIRMATION or FOF_SILENT;
lpFileOp.fAnyOperationsAborted := false;
if SHFileOperation(lpFileOp) = 0 then
Application.MessageBox('备份成功!', '提示', MB_OK)
else
Application.MessageBox('备份失败!', '提示', MB_OK);
end;

////////////////////////////////////////////////
按下按钮B,终止该线程:(相当于终止拷贝文件)

if TerminateThread(aThread.Handle, 0) then
begin
WaitForSingleObject(Handle, INFINITE);
CloseHandle(aThread.Handle);
end;

但是当我按下按钮B后,再次按A按钮,系统报错:XXX文件正在被另一个人或程序使用。
请问各位大虾这是怎么回事,难道按下B按钮后,线程没有被彻底终止吗?请问我应该怎么做,谢谢了!!
 
首先线程终止不是
WaitForSingleObject(Handle, INFINITE);
CloseHandle(aThread.Handle);//这个应该是信号量吧,防止线程同步的
在TMyThread.create;
begin
freeonterminate := true;//线程终止是自动是否释放
end;
在安扭b中添加
MyThread.terminate;//线程终止
 
TO:杯中水,我按照你的方法做了,但是线程并没有被终止,按下B按钮后程序还在继续拷贝
 
除了按杯中水那样修改,另外还需修改:
procedure TMyThread.Execute;
var
lpFileOp: TSHFileOpStruct;
begin
while not Terminateddo
begin
lpFileOp.Wnd := Application.Handle;
lpFileOp.wFunc := FO_COPY;
lpFileOp.pFrom := PChar('...'+ #0#0);
lpFileOp.pTo := PChar('...'+ #0#0);
lpFileOp.fFlags := FOF_NOCONFIRMATION or FOF_SILENT;
lpFileOp.fAnyOperationsAborted := false;
if SHFileOperation(lpFileOp) = 0 then
Application.MessageBox('备份成功!', '提示', MB_OK)
else
Application.MessageBox('备份失败!', '提示', MB_OK);
end;
end;
 
我也加上了while not Terminateddo
但怎么还是不行呢?郁闷
 
这还不简单,设置个断点调试一下看,看线程是否还在运行,如果还在运行则判断B按钮中线程对象有没有搞错了。
 
我在Execute加上了:
if Terminated then
exit;
然后把B按钮的代码改成 aThread.Terminate;还是没有反应。
难道是Terminate不能立即终止线程?请问我还该怎么办啊,急死人了!!
 
Terminate这个本来就不能立即结束线程,要等当前的线程事件做完了才算真正结束啊!
Terminate只是相当于一个标志而已!用于告诉 while not Terminateddo
循环,本次执行完了就结束了,于是,你的线程就跳出循环接着执行循环外的语句,直到结束,才是真的结束啊
 
在Execute中加断点,看是不是还在运行啊,如果还在运行,就是B按钮的代码无效
 
那请问我应该怎样使它立即终止呢?
 
肯定是还在运行的,我想使它立即终止
 
关闭电源是最快的
 
上面的仁兄会开玩笑哈
 
我顶顶顶!!!希望有高手帮我解决问题
 
...单独调用一个DLL复制,终止就UNHOOK那个DLL,这样不行吗
 
楼主,我觉得你要终止的不是TMyThread,而是SHFileOperation(lpFileOp)。我记得一般这种情况,都是自动生成了另一个线程去完成备份的。技术有限,如说错了请大家见谅。
 
后退
顶部