我开了一个线程,功能是用CopyFile拷贝许多文件,如果在别的地方中止这个线程,。。。。

nice521 2002-12-02 02:22:33
我开了一个线程,功能是用CopyFile拷贝许多文件,如果在别的地方中止这个线程,这时如果在硬盘上要
删除掉这个没有拷贝完的文件,则显示错误信息“文件正被使用“。我中止线程用Terminal,在线程的Execute中,我
设定了FreeOnTerminate:=true;这样的话,中止线程应该释放所有的资源吧。
如果我把这个程序关闭掉,则这个没有拷贝完的文件就可以删掉,什么道理?
...全文
170 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
alphax 2002-12-04
  • 打赏
  • 举报
回复
对阿,应该先调用thd.Resume;再调用thd.Terminate;
ilovekof 2002-12-04
  • 打赏
  • 举报
回复
你的代码挂起进程后没有回复哎
stanely 2002-12-04
  • 打赏
  • 举报
回复
把你拷贝文件的代码贴出来
nice521 2002-12-04
  • 打赏
  • 举报
回复
也因为文件没有拷贝完,所以如果删除这个没有拷贝完的文件就出错,如果退出这个程序,则这个文件就可以删除掉,不知道什么道理。
nice521 2002-12-04
  • 打赏
  • 举报
回复

我的程序是这样的:在线程内部执行多个文件的拷贝,另外主程序可以让线程停止。
主程序这样:
Button1.click
{
thd.Suspend();
if(MessageBox(NULL,"备份还未完成,确定要停止?","确定",MB_OKCANCEL)=IDOK)
thd.Terminate();
}
在线程内部:
while not Terminated do
{
}
这样的话,在主程序中按下Button1,文件还是没有拷贝完线程就停止了,不知道什么原因?谢谢帮忙!!!
nice521 2002-12-04
  • 打赏
  • 举报
回复
谢谢你们,我程序的错误就是挂起进程后没有回复,应该先调用thd.Resume;再调用thd.Terminate。

stanely 2002-12-03
  • 打赏
  • 举报
回复
如果你使用了copyfile这个函数,那么这样的情况应该不会出现阿。
alphax 2002-12-03
  • 打赏
  • 举报
回复
CopyFile函数的情况我知道的不多,也不太明白你手动中止的意思,但是
对于FreeOnTerminate,只不过是在Execute函数结束时调用一下Free,至于
有没有关闭文件,要看你的Destroy实现。线程和进程的概念是不同的。
nice521 2002-12-03
  • 打赏
  • 举报
回复
“他们的生存期是进程的生存期“,对阿,线程都停止了,FreeOnTerminate:=true;应该释放掉所有线程占用的资源啊,包括占用文件。
用copyfile拷贝多个文件,我并没有显式关闭文件,但是正常拷贝结束时,由于设置了FreeOnTerminate:=true;所有的文件都自动地关闭了啊,同理,我手动中止
线程,也应该是同样的道理阿。

stanely 2002-12-03
  • 打赏
  • 举报
回复
只会执行完while里面的所有语句才能检测到terminated,这样才可能退出,所以copyfile产生的句柄不会来不及被释放阿,因为copyfile一定执行结束了!
stanely 2002-12-03
  • 打赏
  • 举报
回复
你的理解有误阿,

copyfile在线程内部是单步执行的阿,当copyfile执行结束以后才能继续执行线城内的其他代码。

而thread.terminate并不是强制让线程终止,只是改变terminated属性,变成true,而execute里面一般是这样子的:
while not terminated do
begin
copyfile....//永远不会把这个函数强制中断阿!上面的分析似乎有些不合理阿
end;

alphax 2002-12-02
  • 打赏
  • 举报
回复
你用Terminate中止线程以前或之后应该显式把所有用到的文件句柄释放(CloseHandle),比如CloseFile或者FileStream.Free。
像文件句柄这些核心对象不会随线程中止而自动释放的,他们的生存期是进程的生存期
BlueTrees 2002-12-02
  • 打赏
  • 举报
回复
打开文件有一个句柄,和进程关联,没有正确的释放句柄,很可能导致回滚。

1,184

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧