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

TClientSocket與TTimer配合的問題

答題得分者是:gemi0305
kenbcb
中階會員


發表:171
回覆:129
積分:60
註冊:2003-07-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-08-19 17:46:27 IP:61.222.xxx.xxx 未訂閱
請問各位: 程式功能:有一個command及二個echo(A,B),當送command時回A,但超過3秒時回應"no reponse",而一樣接收回應但不處理;echo(B)是server送出來的,無需送command ~請大家指導~謝謝! 這是我做的程式,不知錯在那 bool isTimeOut; bool getResponse; AnsiString text; void __fastcall TfrmAdmin::Timer1Timer(TObject *Sender) { //Time Out process Timer1->Enabled = false; if(!getResponse) { isTimeOut = true; ShowMessage("Server no respond!"); } } void __fastcall TfrmAdmin::ClientSocket1Read(TObject *Sender, TCustomWinSocket *Socket) { //the function process data write to buffer by socket int len = Socket->ReceiveLength(); getResponse = true; text = Socket->ReceiveText(); } void __fastcall TfrmAdmin::btnConnectClick(TObject *Sender) { //等待回應,超過3秒不回應接受到的訊息, while(Timer1->Enabled == true) { if(getResponse) break; } if(!isTimeOut) Application->MessageBox(text,"Echo",MB_OK); }
gemi0305
版主


發表:81
回覆:564
積分:629
註冊:2003-05-11

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-08-19 20:48:35 IP:61.224.xxx.xxx 未訂閱
請問問題中的command和二個echo(A,B)是指?? 可否再描述一下~ 還有這個
kenbcb
中階會員


發表:171
回覆:129
積分:60
註冊:2003-07-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-08-20 09:55:25 IP:61.222.xxx.xxx 未訂閱
ECHO(A,B)是說有二個不同的回應,command是client送給server的資料,而server收到會回應其對應~ 送command回a,而server有時會送b來當類似緊急通知,但client送command時有timeout的限制
gemi0305
版主


發表:81
回覆:564
積分:629
註冊:2003-05-11

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-08-20 22:35:14 IP:61.224.xxx.xxx 未訂閱
我修改了,也測試過,能夠做到你說的功能, 說明一下我所修改的地方,    第一: 不能用while迴圈來計時,因為while會占住cpu讓其他的程式無法執行, 所以我用了一個timer2,以0.1秒來當檢查頻率,來替代while, 保留你原先的想法。    第二: 每次要傳送資料的時候,記得把判斷的參數,如GetResponse等的值,初始化。    第三: MessageBox我改成ShowMessage。    有需要的話,我再把測試的小範例上傳給你試 < class="code"> TForm1 *Form1; bool isTimeOut; bool getResponse; AnsiString text; //-------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { Timer1->Interval=3000; //用來計時三秒的 Timer1->Enabled=false; Timer2->Interval= 100; //用來替代While迴圈 Timer2->Enabled=false; } //------------------------------------------------------------- void __fastcall TForm1::Timer1Timer(TObject *Sender) { //Time Out process Timer1->Enabled = false; if(!getResponse) { isTimeOut = true; ShowMessage("Server no respond!"); } } //------------------------------------------------------------ void __fastcall TForm1::ClientSocket1Read(TObject *Sender, TCustomWinSocket *Socket) { //the function process data write to buffer by socket int len = Socket->ReceiveLength(); getResponse = true; text = Socket->ReceiveText(); } //------------------------------------------------------------ void __fastcall TForm1::Button1Click(TObject *Sender) { //等待回應,超過3秒不回應接受到的訊息, getResponse = false; //記得每次傳送前就要把值重設 isTimeOut=false; ClientSocket1->Socket->SendText("Request!!"); Timer1->Enabled = true; //啟動三秒計時 Timer2->Enabled = true; //用一個計時器來取代while // while(Timer1->Enabled == true) // { // if(getResponse)break; // } // if(!isTimeOut) Application->MessageBox(text,"Echo",MB_OK); } //------------------------------------------------------------- void __fastcall TForm1::Timer2Timer(TObject *Sender) { //while的程式移到此來 if(getResponse) { Timer2->Enabled=false; //把計時器停止,有break的效果 if(!isTimeOut) ShowMessage("ECHO : " text); } } //------------------------------------------------------------- 國泰平安
系統時間:2024-05-04 21:14:59
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!