線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2957
推到 Plurk!
推到 Facebook!

如何设置FtpPutFile 的timeout

答題得分者是:geniustom
cavalier
一般會員


發表:11
回覆:14
積分:5
註冊:2003-12-05

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-11-09 17:31:39 IP:218.17.xxx.xxx 未訂閱
最近碰到一个问题,当上传一个文件到指定的ftp时,需要花费很多时间(不是因为文件太大,可能网络问题),用FtpPutFile来上传时,会导致整个程式长时间无法响应,如何去设置一个timeout值,使得如果一定时间程式无响应,就中止FtpPutFile,避免整个程式长时间无法响应呢? 谢谢
geniustom
版主


發表:100
回覆:303
積分:260
註冊:2003-01-03

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-11-10 03:11:30 IP:219.68.xxx.xxx 未訂閱
您好..關於這個問題 其實您可以先PING遠端的主機..如果PING的到.. FTP再去連線.. 關於PING對方..請參考 > =程式是一種藝術 也是訓練自己的分析規劃= =是段落分明 或是雜亂無章= =是一言以敝 或是廢話連篇= =是一目了然 或是艱深難懂= 體會這份藝術 您會了解另一份喜悅與成就
geniustom
版主


發表:100
回覆:303
積分:260
註冊:2003-01-03

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-11-10 03:19:17 IP:219.68.xxx.xxx 未訂閱
補充一下..如果您堅持不想使用元件... 還有另一種方法..可以從API中設定TIMEOUT 來源..http://forum.nifty.com/fdelphi/samples/01105.html(小日本的站ㄛ)
  procedure SetTimeOut; //TimeOutの設定
  var
    TimeOut: integer;
  begin
    TimeOut := 60 * 1000; //単位はmsなんで秒に変換(60秒に設定)
    InternetSetOption(hSession, INTERNET_OPTION_RECEIVE_TIMEOUT, @TimeOut,
      SizeOf(TimeOut));
  end;    
GOOD LUCK =程式是一種藝術 也是訓練自己的分析規劃= =是段落分明 或是雜亂無章= =是一言以敝 或是廢話連篇= =是一目了然 或是艱深難懂= 體會這份藝術 您會了解另一份喜悅與成就
cavalier
一般會員


發表:11
回覆:14
積分:5
註冊:2003-12-05

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-11-10 10:28:35 IP:218.18.xxx.xxx 未訂閱
function TNWFtp.UploadFile(sFileName: String; DirName: String): Boolean;
var
  TimeOut: integer;
begin
  result := false;
  if Active then
  begin
    TimeOut := 15 * 1000;
    InternetSetOption(FFtpHandle, INTERNET_OPTION_RECEIVE_TIMEOUT, @TimeOut, SizeOf(TimeOut));
    result := FtpPutFile(FFtpHandle, PChar(sFileName), PChar(ExtractFileName(sFileName)), FTP_TRANSFER_TYPE_BINARY, 0);
    if result = false then
    begin
      HandleInternetGetLastResponseInfo;
      Exit;
    end;
  end;  
end;
好像不起作用哦~ 發表人 -
geniustom
版主


發表:100
回覆:303
積分:260
註冊:2003-01-03

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-11-10 21:08:11 IP:219.68.xxx.xxx 未訂閱
cavalier您好... 我上兩篇PO的文章..分別是3種方法..不過您怎麼全都湊在一啟用了 < >< > 法1...先PING對方..PING到才連線..(接著才寫FtpPutFile) 法2...使用NMFTP..裡面就已經可以設定TIMEOUT屬性了..(不要使用FtpPutFile這個函數) 法3...從API中設定TIMEOUT..(接著才寫FtpPutFile) 困難度:3>1>2.. 如果搞不定..建議您還是選擇第二種..請看下圖.. 關於怎麼上傳檔案的範例...請參考 【分享】以 > =程式是一種藝術 也是訓練自己的分析規劃= =是段落分明 或是雜亂無章= =是一言以敝 或是廢話連篇= =是一目了然 或是艱深難懂= 體會這份藝術 您會了解另一份喜悅與成就
cavalier
一般會員


發表:11
回覆:14
積分:5
註冊:2003-12-05

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-11-11 10:52:22 IP:218.18.xxx.xxx 未訂閱
谢谢geniustom的关注 我给出的那段代码是我自己写的一个基于windows api的一个类 现在碰到的问题是:连接到ftp server是没问题的,download文件也没问题;但是,uploade文件是就出现问题,我跟踪了代码,发现 result := FtpPutFile(FFtpHandle, PChar(sFileName), PChar(ExtractFileName(sFileName)), FTP_TRANSFER_TYPE_BINARY, 0); 这个函数长时间不能返回,导致整个程式无法响应,hold住了。 有什么办法在指定的timeout值里,强制FtpPutFile返回呢? 例外,找到这篇文章 BUG: InternetSetOption Does Not Set Timeout Values http://support.microsoft.com/kb/q176420 里面提到 NOTES: • INTERNET_OPTION_RECEIVE_TIMEOUT no longer works in Internet Explorer 5.0. For more information, see the following article in the Microsoft Knowledge Base: 224318 HOWTO: Control Connection Timeout Value by Creating Second Thread • The latest version of the Wininet.dll file that shipped with Internet Explorer 5.01 (available for download) fixes all timeout problems for HTTP APIs only. FTP timeouts still cannot be changed. 發表人 - cavalier 於 2004/11/11 11:01:20
geniustom
版主


發表:100
回覆:303
積分:260
註冊:2003-01-03

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-11-12 01:28:59 IP:219.68.xxx.xxx 未訂閱
cavalier您好..您說的不錯..之後我有TRACE過.. 發現InternetSetOption這個函式的確是無法作用的... 另外..FtpPutFile其實是一個"初階"的API..只能拿來做很陽春的傳送功能.. 如果您想要她去控制傳輸檔案的區段..或是有辦法顯示進度..不被HOLD住.. 那是不可能的..不過FtpPutFile的最後一個參數可以結合InternetSetStatusCallback.. 去做..當有狀態傳回時..可以呼叫您自訂的事件處理..不過當傳輸時..還是一點作用也沒有.. 還是會被定住..    如果要讓程式不會定住..由您自己控制要傳輸的區段...使用FtpOpenFile比較適合.. 可參考 class="code"> PROCEDURE 創建一個THREAD(); begin while (flag) do //等待THREAD回報 begin if 未達TIMEOUT then application.procemessages //這樣您的主程式不會被HOLD住 else begin 殺掉該THREAD //表示被HOLD住..就是檔案沒傳完..或連不上.. EXIT; end; end; 殺掉該THREAD //跳到這行..表示THREAD沒有被HOLD..而且檔案也傳完了..所以也可以殺THREAD end; 以上只是個範例..可能沒有很好..您可以自己想一套更好的演算法去實做.. 總之..用THREAD的方式是絕對可以從主程式去控管該THREAD能夠存活的時間.. THREAD本身只負責傳檔..您只要給THREAD15秒的存活時間.. THREAD若提早完成任務..就可提早殺THREAD THREAD如果15秒還沒完成..還是殺THREAD THREAD相關文章 > =程式是一種藝術 也是訓練自己的分析規劃= =是段落分明 或是雜亂無章= =是一言以敝 或是廢話連篇= =是一目了然 或是艱深難懂= 體會這份藝術 您會了解另一份喜悅與成就
cavalier
一般會員


發表:11
回覆:14
積分:5
註冊:2003-12-05

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-11-17 10:55:28 IP:218.18.xxx.xxx 未訂閱
geniustom:十分感谢你的详细解说    看来也只能用你所说的方法了
系統時間:2024-05-18 15:29:38
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!