【问题标题】:FTP Upload using new thread and waiting for upload to finish使用新线程进行 FTP 上传并等待上传完成
【发布时间】:2014-10-17 18:27:05
【问题描述】:

我似乎无法弄清楚我做错了什么,我有以下代码将文件上传到 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;

【问题讨论】:

  • 如果要等待,为什么要使用线程?您应该使用处理线程的事件驱动解决方案
  • 您没有显示您持有对线程的引用的位置。如果你有一个,你写 Thread.WaitFor。正如 Rufo 爵士所说,你为什么要使用线程然后进行同步。如果您真的想处理消息并等待,请使用非繁忙循环正确执行。那将是 MsgWaitForMultipleObjects。但是事件驱动更好。处理 OnTerminate。

标签: multithreading delphi ftp delphi-xe


【解决方案1】:

TIdFTP.Put()是一种阻塞方式,上传完成后才会退出。所以按照设计,线程本身已经在等待。

您的编译器错误是因为您试图从TFTPThread 类类型本身访问Handle 属性,但它没有声明为class 属性,因此您不能这样做。您需要通过指向TFTPThread 对象的指针来访问Handle 属性:

FTPThread := TFTPThread.Create;
...
while WaitForSingleObject(FTPThread.Handle, 0) = WAIT_TIMEOUT do
  Application.ProcessMessages;

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

FTPThread := TFTPThread.Create;
...
FTPThread.WaitFor;

【讨论】:

  • 嗨 Remy,我不知道如何创建指向 TFTPThread 的指针,它会去哪里:FTPThread := TFTPThread.Create;
  • 你写了一个线程类,你目前是如何使用它的?显然,你不能Execute 一个你没有Create 的线程。
猜你喜欢
  • 2018-04-08
  • 2019-09-14
  • 2017-07-11
  • 1970-01-01
  • 2020-02-12
  • 2018-12-21
  • 2017-03-07
  • 2011-06-11
相关资源
最近更新 更多