NMFTP在訊號微弱時,無法abort(); |
答題得分者是:careychen
|
maped
一般會員 發表:13 回覆:19 積分:6 註冊:2008-10-06 發送簡訊給我 |
Dear all,
最近寫了一個上傳程式,使用NMFTP元件, 但是發現如果用無線傳輸且訊號微弱時, 程式都會一直停留在 NMFTP1->Upload(str1 str2); 無法到下一行去, 我有設個Timer去偵測單筆上傳是否過久, 過久就會執行NMFTP1->Abort(); 但是從Timer回來,程式還是一直停留在 NMFTP1->Upload(str1 str2); 請問大家,還有何方法可解呢?(我也試過執行NMFTP1->Disconnect();但是依然卡住) 另外有試過改用 IdFTP來做,但是一旦 IdFTP1->Connect(); 連線後, 我的Timer就進不去了,這樣我就無法在等待時間過長時把它中斷, 請問大家,這樣有無方法可解呢? 還是有人有別種FTP方式可以提供給我呢?非常感激不盡。 若有任何建議或資料,除了留言之外,也可寄以下mail給我,謝謝。 mail: maped@mail2000.com.tw |
maped
一般會員 發表:13 回覆:19 積分:6 註冊:2008-10-06 發送簡訊給我 |
Dear all,
我自己有找到類似的情況的問題,以下兩篇, http://delphi.ktop.com.tw/board.php?cid=168&fid=920&tid=53493 http://delphi.ktop.com.tw/board.php?cid=168&fid=913&tid=45723 但是我的情況是我用 IdFTP1來作, 當再傳輸時我刻意拿NB遠離訊號直到剩下一格左右, 這時我看網路封包的已收到是靜止不動的, 此時程式會停留在 IdFTP1->Put(str1, str2); 這行 但是timer卻是無法進入,因為我有設停留點在timer裡, 也有用個Label來看, void __fastcall Tfm_upload::Timer1Timer(TObject *Sender) { Label1->Caption = timer1_cnt; Application->ProcessMessages(); } 這樣我就無法偵測上傳過久把它中斷 IdFTP1->Abort(); 請問大家有何建議或方法嗎? |
RaynorPao
版主 發表:139 回覆:3622 積分:7025 註冊:2002-08-12 發送簡訊給我 |
(1)感覺你所描述的現象有點不合理,以我的認知而言,照理說 Timer 是不會沒有辦法進入的
(2)建議你先把 Timer 裡面的 Application->ProcessMessages(); 拿掉,然後在 IdFTP1Work 裡面加上 Application->ProcessMessages(); 然後再試試看是否可行? (3)如果還是不行的話,建議你另外建立一個新的專案,裡面只針對這個問題做測試(不包含其他與此問題無關的程式碼),藉此來釐清問題,因為也有可能是其他的程式碼造成的現象 (4)最後,還是不行的話,那可能就要試試用 Thread 來做了,也就是把你原來 Timer 裡面的程式碼,經過修改之後,放到 Thread 裡面,至於建立和刪除此 Thread 的時機,跟原本操作 Timer 的時機一樣
------
-- 若您已經得到滿意的答覆,請適時結案!! -- -- 欲知前世因,今生受者是;欲知來世果,今生做者是 -- -- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 -- |
maped
一般會員 發表:13 回覆:19 積分:6 註冊:2008-10-06 發送簡訊給我 |
感謝版主的回應,
這個問題也讓我覺得很不可思議, 照理說 timer元件應該在不管任何情形下都應該要有作用才對,就我的認知而言, 但是同樣的情形下,也就是訊號微弱剩一格且收到封包幾乎停止的情形下, 程式都一樣,只修改一行NMFTP1->Upload(str1 str2);改為IdFTP1->Put(str1, str2); 但是timer在NMFTP下是可以進入的,但是IdFTP卻不行,真是很奇怪, Timer 裡面的 Application->ProcessMessages();是我後來才加的,之前是沒有, 另外在相同的情形下 IdFTP1Work 也是進不去,似乎要有傳輸成功才會進去, 關於第三點我會找時間單獨試一下, 現在我先改用 Thread 來做, 有結果再告訴大家。 |
careychen
尊榮會員 發表:41 回覆:580 積分:959 註冊:2004-03-03 發送簡訊給我 |
Hi, 在 新版的 Indy 10 上的 IdFTP 元件有新增了一個屬性是 TransferTimeout ,他的用途是把 IdFTP 中的
DataChannel 加上 ReadTimeOut 的指令 如果大大您方便的話,建議您直接升級成 Indy10 會方便點 如果不方便的話,下面我貼一段是 IdFTP Unit 裡有個 InitDataChannel 的 procedure 是 Indy 9 與 Indy 10 的差別 您有需要的話,就請自行修改 Indy 的程式 [code delphi] //Indy 10 procedure TIdFTP.InitDataChannel; var LSSL : TIdSSLIOHandlerSocketBase; begin ... (略) // (Indy 9 中沒有下面這一行和上面略的那一段) FDataChannel.IOHandler.ReadTimeout := FTransferTimeout; FDataChannel.IOHandler.SendBufferSize := IOHandler.SendBufferSize; FDataChannel.IOHandler.RecvBufferSize := IOHandler.RecvBufferSize; FDataChannel.OnWork := OnWork; FDataChannel.OnWorkBegin := OnWorkBegin; FDataChannel.OnWorkEnd := OnWorkEnd; end; [/code] [code delphi] // indy 9 procedure TIdFTP.InitDataChannel; begin FDataChannel.SendBufferSize := SendBufferSize; FDataChannel.RecvBufferSize := RecvBufferSize; // 請新增下面這一行!! 而原本的 idFTP 元件上有 ReadTimeout 可設定!! // ※※※ 注意這個值是 Millisecond 的單位 !! FDataChannel.ReadTimeout := Self.ReadTimeout; FDataChannel.OnWork := OnWork; FDataChannel.OnWorkBegin := OnWorkBegin; FDataChannel.OnWorkEnd := OnWorkEnd; end; [/code]
------
價值的展現,來自於你用哪一個角度來看待它!!
編輯記錄
careychen 重新編輯於 2008-10-10 23:43:42, 註解 無‧
|
maped
一般會員 發表:13 回覆:19 積分:6 註冊:2008-10-06 發送簡訊給我 |
|
careychen
尊榮會員 發表:41 回覆:580 積分:959 註冊:2004-03-03 發送簡訊給我 |
您可以在你的 .h 檔看到一個 #include <IdFTP.hpp> 您在 < > 的中間按下 Ctrl + Shift + G 可以直接跳到這個檔案
就可以編輯了,如果沒有的話......... 因為我沒有 BCB 6 ,而且我不曉得您的使用版本 (不過我猜是 BCB6 Indy9 ) 所以我沒辦法直接跟您說明,不好意思 這篇是 RaynorPao 版主所回應的 安裝Indy發生錯誤 ,您可以參考一下
------
價值的展現,來自於你用哪一個角度來看待它!! |
maped
一般會員 發表:13 回覆:19 積分:6 註冊:2008-10-06 發送簡訊給我 |
Dear all,
剛剛查了一下我的 Indy 版本為 8.0.25 耶!! 看來可以直接更新到 Indy10的版本好了, 可以問一下在網址嗎? 我到http://www.indyproject.org/Sockets/Download/Files/Indy10.EN.aspx下載, 但是告訴我 page不存在 現在最新好像是Indy 10.2.3。 |
careychen
尊榮會員 發表:41 回覆:580 積分:959 註冊:2004-03-03 發送簡訊給我 |
------
價值的展現,來自於你用哪一個角度來看待它!! |
maped
一般會員 發表:13 回覆:19 積分:6 註冊:2008-10-06 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |