Multithreading 使用新线程进行FTP上载并等待上载完成

Multithreading 使用新线程进行FTP上载并等待上载完成,multithreading,delphi,ftp,delphi-xe,Multithreading,Delphi,Ftp,Delphi Xe,我似乎不知道我做错了什么,我有以下代码将文件上传到ftp,它在一个新线程上,我如何告诉它等待上传完成后再继续 procedure TFTPThread.Execute; begin FTPClient.Host:=FTPAddress; FTPClient.Username:=FTPUsername; FTPClient.Password:=FTPPassword; FTPClient.Connect; FTPClient.Put(ZipFileName,'Logs.zip'

我似乎不知道我做错了什么,我有以下代码将文件上传到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;
我在网上找到了这个,但我不确定我做错了什么:

E2233属性“句柄”在此不可访问

  while WaitForSingleObject(TFTPThread.Handle, 0) = WAIT_TIMEOUT do
  Application.ProcessMessages;
TIdFTP.Put()
是一种阻止方法,在上传完成之前不会退出。因此线程本身已经在等待了,这是设计上的

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

FTPThread := TFTPThread.Create;
...
while WaitForSingleObject(FTPThread.Handle, 0) = WAIT_TIMEOUT do
  Application.ProcessMessages;
另一方面,
TThread
有自己的
WaitFor()
方法,您不需要直接调用
WaitForSingleObject()
(除非您想指定一个非无限超时,而
WaitFor()
不支持该方法):

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

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

FTPThread := TFTPThread.Create;
...
while WaitForSingleObject(FTPThread.Handle, 0) = WAIT_TIMEOUT do
  Application.ProcessMessages;
另一方面,
TThread
有自己的
WaitFor()
方法,您不需要直接调用
WaitForSingleObject()
(除非您想指定一个非无限超时,而
WaitFor()
不支持该方法):


如果您想等待,为什么要使用线程?您应该使用事件驱动的解决方案来处理线程,而不显示线程引用的位置。如果你有一个线程,你可以写Thread.WaitFor。正如鲁福爵士所说,为什么要使用线程,然后进行同步。如果您真的想处理消息并等待,请使用非忙循环正确执行。这将是MsgWaitForMultipleObjects。但事件驱动更好。如果您想等待,为什么要使用线程?您应该使用事件驱动的解决方案来处理线程,而不显示线程引用的位置。如果你有一个线程,你可以写Thread.WaitFor。正如鲁福爵士所说,为什么要使用线程,然后进行同步。如果您真的想处理消息并等待,请使用非忙循环正确执行。这将是MsgWaitForMultipleObjects。但事件驱动更好。Handle ontterminate.HI Remy,我不确定如何创建指向tftphread的指针,它会去哪里:FTPThread:=tftphread.create;您编写了一个线程类,目前如何使用它?显然,你不能执行一个你不创建的线程。嗨,雷米,我不知道如何创建指向tftphread的指针,它会去哪里:FTPThread:=tftphread.Create;您编写了一个线程类,目前如何使用它?显然,您不能执行未创建的线程。