//unit2,单独的线程类:type
  TMyThread = class(TThread)procedure TMyThread.Execute;
begin
   Unit1.Form1.Copy;//调用主窗口的Copy函数
end;//unit1,包含Form的主窗口类:procedure TForm1.Button1Click(Sender: TObject);//按下此按钮后,开始启动线程进行文件拷贝
var
  thread: TMyThread;
begin
  thread := TMyThread.Create(false);
end;procedure TForm1.Copy;//文件的拷贝函数
var
  lpFileOp: TSHFileOpStruct;
begin  lpFileOp.Wnd := Application.Handle;
  lpFileOp.wFunc := FO_COPY;
  lpFileOp.pFrom := PChar('C:/Temp'+ #0#0);
  lpFileOp.pTo := PChar('D:/Temp'+ #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;程序运行结果是正确的,但是我不知道我这样写是否合理,请大家指教!!

解决方案 »

  1.   

    再问一个问题,我现在是用thread := TMyThread.Create(false);启动一个线程进行拷贝,如果我现在想停止拷贝,应该怎么做呢?thread.Suspend;这样可以吗?
      

  2.   

    不合理如果这个copy函数里面有用到VCL组的话,那这段代码实际上是在主线程做的,应该把代码写入线程的Execute;
    var
      lpFileOp: TSHFileOpStruct;
    begin
      lpFileOp.Wnd := Application.Handle;
      lpFileOp.wFunc := FO_COPY;
      lpFileOp.pFrom := PChar('C:/Temp'+ #0#0);
      lpFileOp.pTo := PChar('D:/Temp'+ #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;
    //把上面的代码写放线程的Execute
      

  3.   

    哦。如果我用thread.Suspend暂停了线程,然后再用thread.Resume重新激活它,这样做对不呢?就相当于是拷贝过程中的暂停和继续,请教这样做合理不。
      

  4.   

    如果我要终止这个线程,也就是说想取消拷贝,我应该使用哪个函数?
    是    ManualThread.Free;还是  ManualThread.Terminate;还是  ManualThread.Destroy;
      

  5.   

    哦。如果我用thread.Suspend暂停了线程,然后再用thread.Resume重新激活它,这样做对不呢?就相当于是拷贝过程中的暂停和继续,请教这样做合理不。
    -------
    试一下就知道了.
    如果我要终止这个线程,也就是说想取消拷贝,我应该使用哪个函数?
    是    ManualThread.Free;还是  ManualThread.Terminate;还是  ManualThread.Destroy;Terminate.
    如果你的FreeOnTerminate为false,那么你还要调用Free.