\\类声明
TMyThread=Class(TThread)
    protected
      procedure Execute;override;
    private
       Pfrom:string;
       PTo:string;
    public
  end;
\\执行函数
procedure TMyThread.Execute;
procedure Copy;
var
  f:SHFILEOPSTRUCT;  //拷贝文件的变量
begin
  f.pFrom:=pchar(self.Pfrom);
  f.pTo:=Pchar(self.PTo);
  f.wFunc:=FO_COPY;
  f.Wnd:=Form1.Handle;
  f.fFlags:=FOF_FILESONLY+FOF_NOCONFIRMATION+FOF_NOERRORUI+FOF_SILENT;
  try
  if SHFileOperation(f)<>0 then   //拷贝文件函数
   begin
          Inc(FileUpdateFalse);
          form1.Memo1.Lines.Add('目标文件'+self.PTo+'更新失败!');
        end
  else
    inc(FileUpdate);
  finally
  self.Terminate;   //线程完成自动释放
  end;
end;begin
  Copy;
end;//下面是一个递规查找文件的函数
procedure MyCopy;
var
  FileName:string;
  ThreadCopy:TMyThread;
begin
  .... //这里先查找到文件名
  ThreadCopy:=TMyThread.Create(True);
  ThreadCopy.Pfrom:=FileName;    //传递文件名参数给线程
  ThreadCopy.PTo:=ExePath2;     //传递目标目录给线程
  ThreadCopy.FreeOnTerminate:=True;  //线程结束自动释放
  ThreadCopy.Resume;            //线程继续执行
      
end;上面是我写的一个拷贝文件的线程,能这样传递参数给线程吗?
如果线程终止.怎么释放掉线程?请教大家,重分相谢!

解决方案 »

  1.   

    你退出的时候,判断一下所有线程的状态,如果有一个线程没有完成,则提示用Terminate结束
      

  2.   

    你的TMyThread.Execute里只有一个Copy,线程在Copy执行完后(Copy中的Self.Terminate其实是不必要的)就已经停止执行了。因为你在启动线程前已经设置FreeOnTerminate为True,所以线程早已自动释放掉了,你的变量ThreadCopy指向的内存对象不再有效。你在退出的时候一定执行了ThreadCopy.Free。因为线程早已释放,线程的句柄在线程释放时也就同时失效了,所以系统提示“无效的句柄”。
      

  3.   

    你在线程内有
       self.Terminate;   //线程完成自动释放
    当线程完毕自动释放的时候就会出错。并且你这样结束的方法似乎不正确。
    你要线程自动释放,你要设置线程的OnTerminate属性 ,
    你可以参考DELPHI 的一个线程的例题。
      

  4.   

    xxThread.FreeOnTerminate := True;
      

  5.   

    唉,看来好多人对线程的用法还是不大了解。
    我找个时间写篇文章发在Blog上,再贴过来吧。