2014-10-17 71 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