TClientSocket與TTimer配合的問題 |
答題得分者是:gemi0305
|
kenbcb
中階會員 發表:171 回覆:129 積分:60 註冊:2003-07-15 發送簡訊給我 |
請問各位:
程式功能:有一個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 發送簡訊給我 |
|
kenbcb
中階會員 發表:171 回覆:129 積分:60 註冊:2003-07-15 發送簡訊給我 |
|
gemi0305
版主 發表:81 回覆:564 積分:629 註冊:2003-05-11 發送簡訊給我 |
我修改了,也測試過,能夠做到你說的功能,
說明一下我所修改的地方, 第一:
不能用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);
}
}
//------------------------------------------------------------- 國泰平安
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |