2014-10-17 138 views
1

我似乎无法弄清楚我在做什么错了,我有以下代码上传文件到FTP,它在一个新的线程,如何可以我告诉它在继续之前等待上传完成?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; 
+1

如果你想等待,为什么你使用一个线程?您应该使用处理线程的事件驱动解决方案 – 2014-10-17 18:31:11

+0

您不会显示您持有对该线程的引用的位置。如果你有一个你写的Thread.WaitFor。正如Rufo爵士所说,你为什么使用线程然后进行同步。如果你真的想处理消息,并等待在非忙循环中正确执行。那将是MsgWaitForMultipleObjects。但事件驱动更好。处理终止。 – 2014-10-17 18:38:25

回答

5

TIdFTP.Put()是一个阻塞方法,直到上传完成才会退出。所以线程本身已经在等待,通过设计。

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

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

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

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

嗨,雷米,我不知道如何创建指向TFTPThread的指针,这将发生在:FTPThread:= TFTPThread.Create; – Zulake 2014-10-17 20:24:29

+0

你写了一个线程类,你目前如何使用它?显然,你不能'执行'你不'创建'的线程。 – 2014-10-17 21:36:57

+0

我明白了,谢谢! – Zulake 2014-10-20 14:34:30