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

以兩台數據機對傳資料,但其中一台會出現程式無回應狀況

尚未結案
kadlac
一般會員


發表:18
回覆:30
積分:9
註冊:2004-07-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-01-08 17:55:18 IP:61.219.xxx.xxx 未訂閱
大家好! 小弟寫了一個程式,以兩台數據機A及B對傳資料, 每偶數分鐘時A啟動連線,連線成功後B傳資料給A 每奇數分鐘時B啟動連線,連線成功後A傳資料給B 所以同一程式既當發送端也當接收端, 測試結果其中一台會出現程式無回應狀況,請大家幫幫忙...... 我是用文魁書中的TComm 元件來做的 程式架構如下: int connect=0; Bool Transmit=false; AnsiString astr; void modem(); void __fastcall TForm1::Timer1Timer(TObject *Sender) { if (偶數分鐘) { Timer1->Enabled=false; modem(); Timer1->Enabled=true; } if (奇數分鐘) { Timer1->Enabled=false; modem(); Timer1->Enabled=true; } } void modem() { connect=0; transmit=true; Comm1->OutputString(連線之AT command); Delay(30000); // 等30 sec if (connect==1) { Form1->Memo1->Lines->Add("連線成功"); 判斷是否收到 "ABCDEFGHIJKLMNOPQRSTUVWXYZ" ; } transmit=false; } void __fastcall TForm1::Comm1ReceiveData(TObject *Sender) { astr=Comm1->Input; if (astr.Pos("connect")!=0) //連線成功偵測 { if (transmit==true) //A啟動連線 { connect=1; } if (transmit==false) // B發現連線後就傳送字串給A { Delay(1000); Form1->Comm1->OutputString("ABCDEFGHIJKLMNOPQRSTUVWXYZ"); } } 感謝大家的幫忙!!!
暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-01-08 23:17:43 IP:221.169.xxx.xxx 未訂閱
1.你的做法看起來怪怪的。 為什麼不是以 Comm1ReceiveData 這裏有什麼”指令”進來。而去做事情。 而是用 DELAY? 這不像是 C/S 的做法。 C/S 的做法是。 SERVER 接受指令。就去執行這個指令,然後回報結果。 你這樣用 DELAY。。。。會怎樣????會變成PROCESS 進入暫停? 因為你沒有開 MULTITHREAD?因為我沒用過你說的這個元件。所以我不知道你會變成怎樣。 ^_^ 2.MODEM連線是有沒有撥號動作? 有一種”專線MODEM”是不用撥號的。 你只要對 COM PORT丟過去。它就”通透”到對面的COM PORT 進去了。 你要做這樣的動作,不妨考慮一下這種東西。^_^
kadlac
一般會員


發表:18
回覆:30
積分:9
註冊:2004-07-23

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-01-09 12:14:04 IP:61.219.xxx.xxx 未訂閱
謝謝您的回覆!   1.   我現在的問題是同一套程式又要當Client , 又要當Server , 所以變成總有一方要發出指令, 所以當Server 的一方也得發出指令...   所以不能以 Comm1ReceiveData 這裏有什麼”指令”進來,而去做事情。   嚴格來說, 這種架構的確不是 Client Server 架構, 但是 Boss 要求這樣,只好想想有什麼方法達成啦.....     2.   這裡Delay 的目的是要等待連線成功, 所以一定要等...  還是有其它方法?   3.   如果用MultiThread ,在這個地方應該怎麼做,可以示範一下嗎?    4.    目前的需求是以撥號來做,所以不用專線MODEM的模式       非常感謝您的幫忙!!      
暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-01-09 14:31:32 IP:221.169.xxx.xxx 未訂閱
我沒說錯啊。 以 Comm1ReceiveData 這裏有什麼”指令”進來。而去做事情。 請想一下上面這句話。 我以 IRC SERVER 為例解說。 當你連線進IRC時。是你對它有所動作。 你要把你的發言貼上去。是你對SERVER 提出 REQUEST。 SERVER 對你的 REQUEST 做 SERVICE。。。 可是。IRC SERVER 每隔一段時間。會懷疑你已經不小心”斷線”了。 所以他會對IRC CLIENT提出 PING 的 REQUEST。 而你的 IRC CLIENT 就必須要回應 PONG。 這就是你所說的情況了啊。 IRC SERVER 又是提供服務端。又是需求提出者。 IRC CLIENT 也是需求提出者。卻又是提供服務者啊。 可是它們之間的連線只有一條。沒錯吧。 所以。把你的想法改一下。 改成當你的 COMPORT 在收到 CONNECT 時。要做什麼事情。 要丟出字串?還是怎樣? 何者丟?何者收?做個FLAG判別嘛。 OK?????
kadlac
一般會員


發表:18
回覆:30
積分:9
註冊:2004-07-23

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-01-31 11:40:45 IP:61.219.xxx.xxx 未訂閱
大家好! 小弟後來發現是 HandShake問題, 並非程式本身的問題,已經解決了... 謝謝幫忙...感激感激
系統時間:2024-05-05 14:44:25
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!