FTP使用新线程上传并等待上传完成

Zul*_*ake 1 delphi ftp multithreading delphi-xe

我似乎无法弄清楚我做错了什么,我有以下代码将文件上传到ftp,它在一个新线程上,我怎么能告诉它等待上传完成再继续?

procedure TFTPThread.Execute;
begin
  FTPClient.Host:=FTPAddress;
  FTPClient.Username:=FTPUsername;
  FTPClient.Password:=FTPPassword;
  FTPClient.Connect;
  FTPClient.Put(ZipFileName,'Logs.zip');
  FTPClient.Quit;
  FTPClient.Disconnect;
end;
Run Code Online (Sandbox Code Playgroud)

我在网上发现了这个,但我不确定我做错了什么:

E2233此处无法访问"手柄"属性

  while WaitForSingleObject(TFTPThread.Handle, 0) = WAIT_TIMEOUT do
  Application.ProcessMessages;
Run Code Online (Sandbox Code Playgroud)

Rem*_*eau 5

TIdFTP.Put()是一种阻止方法,它在上传完成之前不会退出.因此,线程本身已经在设计中等待.

您的编译器错误是因为您尝试HandleTFTPThread类类型本身访问该属性,但它未被声明为class属性,因此您无法执行此操作.您需要Handle通过指向TFTPThread对象的指针来访问该属性:

FTPThread := TFTPThread.Create;
...
while WaitForSingleObject(FTPThread.Handle, 0) = WAIT_TIMEOUT do
  Application.ProcessMessages;
Run Code Online (Sandbox Code Playgroud)

另一方面,TThread有自己的WaitFor()方法,你不需要WaitForSingleObject()直接调用(除非你想指定一个非无限超时,这WaitFor()不支持):

FTPThread := TFTPThread.Create;
...
FTPThread.WaitFor;
Run Code Online (Sandbox Code Playgroud)