我开了一个线程,功能是用CopyFile拷贝许多文件,如果在别的地方中止这个线程,这时如果在硬盘上要
删除掉这个没有拷贝完的文件,则显示错误信息“文件正被使用“。我中止线程用Terminal,在线程的Execute中,我
设定了FreeOnTerminate:=true;这样的话,中止线程应该释放所有的资源吧。
如果我把这个程序关闭掉,则这个没有拷贝完的文件就可以删掉,什么道理?

解决方案 »

  1.   

    你用Terminate中止线程以前或之后应该显式把所有用到的文件句柄释放(CloseHandle),比如CloseFile或者FileStream.Free。
    像文件句柄这些核心对象不会随线程中止而自动释放的,他们的生存期是进程的生存期
      

  2.   

    如果你使用了copyfile这个函数,那么这样的情况应该不会出现阿。
      

  3.   

    “他们的生存期是进程的生存期“,对阿,线程都停止了,FreeOnTerminate:=true;应该释放掉所有线程占用的资源啊,包括占用文件。
    用copyfile拷贝多个文件,我并没有显式关闭文件,但是正常拷贝结束时,由于设置了FreeOnTerminate:=true;所有的文件都自动地关闭了啊,同理,我手动中止
    线程,也应该是同样的道理阿。
      

  4.   

    CopyFile函数的情况我知道的不多,也不太明白你手动中止的意思,但是
    对于FreeOnTerminate,只不过是在Execute函数结束时调用一下Free,至于
    有没有关闭文件,要看你的Destroy实现。线程和进程的概念是不同的。
      

  5.   

    你的理解有误阿,copyfile在线程内部是单步执行的阿,当copyfile执行结束以后才能继续执行线城内的其他代码。而thread.terminate并不是强制让线程终止,只是改变terminated属性,变成true,而execute里面一般是这样子的:
    while not terminated do
    begin
      copyfile....//永远不会把这个函数强制中断阿!上面的分析似乎有些不合理阿
    end;
      

  6.   

    只会执行完while里面的所有语句才能检测到terminated,这样才可能退出,所以copyfile产生的句柄不会来不及被释放阿,因为copyfile一定执行结束了!
      

  7.   


      我的程序是这样的:在线程内部执行多个文件的拷贝,另外主程序可以让线程停止。
      主程序这样:
     Button1.click
    {
      thd.Suspend();
      if(MessageBox(NULL,"备份还未完成,确定要停止?","确定",MB_OKCANCEL)=IDOK)
            thd.Terminate();
    }
       在线程内部:
      while not Terminated do
    {
    }
      这样的话,在主程序中按下Button1,文件还是没有拷贝完线程就停止了,不知道什么原因?谢谢帮忙!!!
      

  8.   

    对阿,应该先调用thd.Resume;再调用thd.Terminate;
      

  9.   

    谢谢你们,我程序的错误就是挂起进程后没有回复,应该先调用thd.Resume;再调用thd.Terminate。