如何设置FtpPutFile 的timeout |
答題得分者是:geniustom
|
cavalier
一般會員 發表:11 回覆:14 積分:5 註冊:2003-12-05 發送簡訊給我 |
|
geniustom
版主 發表:100 回覆:303 積分:260 註冊:2003-01-03 發送簡訊給我 |
|
geniustom
版主 發表:100 回覆:303 積分:260 註冊:2003-01-03 發送簡訊給我 |
補充一下..如果您堅持不想使用元件...
還有另一種方法..可以從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 發送簡訊給我 |
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 發送簡訊給我 |
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 發送簡訊給我 |
谢谢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 發送簡訊給我 |
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 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |