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

NMFTP在訊號微弱時,無法abort();

答題得分者是:careychen
maped
一般會員


發表:13
回覆:19
積分:6
註冊:2008-10-06

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-10-06 20:33:24 IP:61.31.xxx.xxx 訂閱
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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-10-08 15:04:57 IP:210.243.xxx.xxx 訂閱
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-10-10 00:42:59 IP:61.60.xxx.xxx 訂閱
(1)感覺你所描述的現象有點不合理,以我的認知而言,照理說 Timer 是不會沒有辦法進入的
(2)建議你先把 Timer 裡面的 Application->ProcessMessages(); 拿掉,然後在 IdFTP1Work 裡面加上 Application->ProcessMessages(); 然後再試試看是否可行?
(3)如果還是不行的話,建議你另外建立一個新的專案,裡面只針對這個問題做測試(不包含其他與此問題無關的程式碼),藉此來釐清問題,因為也有可能是其他的程式碼造成的現象
(4)最後,還是不行的話,那可能就要試試用 Thread 來做了,也就是把你原來 Timer 裡面的程式碼,經過修改之後,放到 Thread 裡面,至於建立和刪除此 Thread 的時機,跟原本操作 Timer 的時機一樣
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
maped
一般會員


發表:13
回覆:19
積分:6
註冊:2008-10-06

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-10-10 23:07:09 IP:61.31.xxx.xxx 訂閱
感謝版主的回應,
這個問題也讓我覺得很不可思議,
照理說 timer元件應該在不管任何情形下都應該要有作用才對,就我的認知而言,
但是同樣的情形下,也就是訊號微弱剩一格且收到封包幾乎停止的情形下,
程式都一樣,只修改一行NMFTP1->Upload(str1 str2);改為IdFTP1->Put(str1, str2);
但是timer在NMFTP下是可以進入的,但是IdFTP卻不行,真是很奇怪,
Timer 裡面的 Application->ProcessMessages();是我後來才加的,之前是沒有,
另外在相同的情形下 IdFTP1Work 也是進不去,似乎要有傳輸成功才會進去,
關於第三點我會找時間單獨試一下,
現在我先改用 Thread 來做,
有結果再告訴大家。
careychen
尊榮會員


發表:41
回覆:580
積分:959
註冊:2004-03-03

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-10-10 23:40:18 IP:59.126.xxx.xxx 訂閱
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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-10-13 11:27:58 IP:210.243.xxx.xxx 訂閱
感謝careychen的回應,

能不能再問個問題呢?
我找不到要在哪裡改IdFTP Unit 裡的InitDataChannel 的檔案,
可以告訴我檔案放哪裡呢?
謝謝。

careychen
尊榮會員


發表:41
回覆:580
積分:959
註冊:2004-03-03

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-10-13 12:15:20 IP:60.248.xxx.xxx 訂閱
您可以在你的 .h 檔看到一個   #include <IdFTP.hpp>   您在 <  > 的中間按下 Ctrl + Shift + G 可以直接跳到這個檔案
就可以編輯了,如果沒有的話......... 因為我沒有 BCB 6 ,而且我不曉得您的使用版本 (不過我猜是 BCB6 Indy9 )
所以我沒辦法直接跟您說明,不好意思

這篇是 RaynorPao 版主所回應的 安裝Indy發生錯誤 ,您可以參考一下
------
價值的展現,來自於你用哪一個角度來看待它!!
maped
一般會員


發表:13
回覆:19
積分:6
註冊:2008-10-06

發送簡訊給我
#8 引用回覆 回覆 發表時間:2008-10-13 14:09:28 IP:210.243.xxx.xxx 訂閱
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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2008-10-13 14:56:27 IP:60.248.xxx.xxx 訂閱
hi,請到這裡下載

www.atozed.com/indy/index.EN.aspx

這邊還有 Sample demo 可以下載唷!

8.0 好舊哦................
------
價值的展現,來自於你用哪一個角度來看待它!!
maped
一般會員


發表:13
回覆:19
積分:6
註冊:2008-10-06

發送簡訊給我
#10 引用回覆 回覆 發表時間:2008-10-14 09:12:48 IP:210.243.xxx.xxx 訂閱
Dear all,
感謝 RaynorPao and careychen 兩位大大寶貴的意見,
我想先結案好了,我用Thread可以暫時解決關不掉的問題,
或許是Indy8.0有某些問題吧,
等我升級之後再來看看,
那分數要給誰呢?我想版主應該不需要吧!
所以我給
careychen 好了,希望版主不要介意,
再次非常感謝大家。
系統時間:2017-10-19 22:34:31
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!