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

詢問TClientSocket的事件處理問題

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


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

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-08-16 11:48:33 IP:61.229.xxx.xxx 未訂閱
請問各位: 我在TClientSocket的Write事件寫了一組送一個buffer的處理,而在Read事件寫了一個收取一個buffer的處理,及用一個button的click事件,而內容是先由write送出資料後一直等待read收到資料才進行下一步動作~ 請問要如何寫才能有這樣的動作~ 請大家指導
gemi0305
版主


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-08-16 13:15:30 IP:61.224.xxx.xxx 未訂閱
kenbcb你好,    首先,我想問的是, Write事件,是指當ClientSocket發生寫入資料的動作時,將會觸發的事件, 所以你要用Write事件幫你送資料...這個做法我覺得很特別,    難道你想做無窮迴圈嗎?       因為, 叫Write事件送資料->有"送"的的動作,又再觸發Write事件->Write事件送資料...一直循環~    就像是你用 onClick的事件一直做Click的動作一樣...    這是你要做的事嗎??    還是你只是想,用一個button來送出一個資料, 等待read收到資料再進行下一步動作?  這樣子是不需用到Write事件的~    這是我想問的,可以麻煩說明一下嗎?  以方便大家了解問題,進而幫忙解答~ 國泰平安
kenbcb
中階會員


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-08-16 17:38:32 IP:61.229.xxx.xxx 未訂閱
就按下button時 利用tclientsocket的write事件送出資料然後一直等待tclientsocket的read傳回資料,然後再做下一個動作.(但只等待5秒,超過5秒後沒回應則出現訊息框來說明沒未回應)
gemi0305
版主


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-08-16 20:55:53 IP:61.224.xxx.xxx 未訂閱
kenbcb你好,    這是一個範例,但沒用到Write事件,因為不需要, 如果在5秒內沒觸發Read事件,就會出現訊息框, 用了一個TClientSocket、一個button來啟動傳送,一個Timer來計時,     
    #define   WaitintResponse 0
#define   GotResponse     1
#define   isTimeOut       2    #include 
#pragma hdrstop
#include "Unit1.h"
//------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
unsigned char SendStatus;
//------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
   Timer1->Interval=5000;
}
//------------------------------------------------------------------    void __fastcall TForm1::Button1Click(TObject *Sender)
{
    //給予傳送的資料,把SendStatus設為「等待回應」,並打開計時器,        char *pSend = new char[10];
    pSend = (char*)"Test";
    SendStatus = WaitintResponse;        ClientSocket1->Socket->SendBuf(pSend,10);
    Timer1->Enabled=true;        delete pSend;
}
//----------------------------------------------------------------    void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
    //如果五秒之後SendStatus還在「等待回應」,
    //則停下計時器,顯示訊息        Timer1->Enabled = false;
    if(SendStatus==WaitintResponse)
       {
         SendStatus=isTimeOut;
         ShowMessage("No Response!");
       }
}
//-----------------------------------------------------------------
void __fastcall TForm1::ClientSocket1Read(TObject *Sender,
      TCustomWinSocket *Socket)
{
    //如果在五秒之內,就將接收來的的資料拿來處理,並停止計時
    //在五秒之後,則接收但不處理        if(SendStatus==WaitintResponse)
       {
            char *pReceive = new char[10];
            Socket->ReceiveBuf(pReceive, Socket->ReceiveLength());                SendStatus = GotResponse;
            Timer1->Enabled=false;
            //續後處理的程式寫在此========================                ShowMessage(AnsiString((char*)pReceive));                //============================================                delete pReceive;
       }
    else
       {
            //如果五秒之後,則收但不處理,註一                char *pReceive = new char[10];
            Socket->ReceiveBuf(pReceive, Socket->ReceiveLength());
            delete pReceive;
       }
}     
註一: 五秒之後如果資料還是有傳過來,還是得接收(Receive),但可不處理, 如果不Receive的話,之後送過來的資料會傳不進來。 在下只是提供個想法,參考參考 國泰平安
系統時間:2024-04-29 2:45:36
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!