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

請問在thread裡,要如何使用TClientSocket來傳輸資料

答題得分者是:tomlee
VinceScc
一般會員


發表:1
回覆:0
積分:0
註冊:2002-08-14

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-10-08 17:19:12 IP:210.243.xxx.xxx 未訂閱
各位大大,如題目所說,我需要再thread中使用tclientsocket來與另外一台的server connect,並且送收資料.以下是我參考之前的問題與解答所寫的code,但是並不能與server connect,請各位大大幫忙看一下.  
    //---------------------------------------------------------------------------    __fastcall MyClientThread::MyClientThread(bool CreateSuspended)
        : TThread(CreateSuspended)
{
FreeOnTerminate=true;
Resume();
}
//---------------------------------------------------------------------------
void __fastcall MyClientThread::Execute()
{
    TClientSocket * TempClient;
    for (int i=0;i<FormMain->ComponentCount;i  )
    {
        if (FormMain->Components[i]->Name == ("ClientSocket2"))
        {
            TempClient = dynamic_cast(FormMain->Components[i]);
        }
    }        bool DoFirst=true;
    byte Msg[19];
    int n;        while(!Terminated && n<10)
    {
        if(!(TempClient->Active) )
        {
            TempClient->Address=FormMain->IPAddress;
            TempClient->Port=FormMain->PortNum;
            TempClient->Active=true;
            Sleep(2000);
        }
        else
        {
            TempClient->Socket->SendBuf(Msg,19);
            n=10;
        }
    }
    Terminate();
}
 
tomlee
一般會員


發表:5
回覆:14
積分:18
註冊:2003-10-11

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-10-11 14:55:46 IP:61.58.xxx.xxx 未訂閱
引言: 各位大大,如題目所說,我需要再thread中使用tclientsocket來與另外一台的server connect,並且送收資料.以下是我參考之前的問題與解答所寫的code,但是並不能與server connect,請各位大大幫忙看一下.
    //---------------------------------------------------------------------------    __fastcall MyClientThread::MyClientThread(bool CreateSuspended)
        : TThread(CreateSuspended)
{
FreeOnTerminate=true;
Resume();
}
//---------------------------------------------------------------------------
void __fastcall MyClientThread::Execute()
{
    TClientSocket * TempClient;
    for (int i=0;i<FormMain->ComponentCount;i  )
    {
        if (FormMain->Components[i]->Name == ("ClientSocket2"))
        {
            TempClient = dynamic_cast(FormMain->Components[i]);
        }
    }        bool DoFirst=true;
    byte Msg[19];
    int n;        while(!Terminated && n<10)
    {
        if(!(TempClient->Active) )
        {
            TempClient->Address=FormMain->IPAddress;
            TempClient->Port=FormMain->PortNum;
            TempClient->Active=true;
            Sleep(2000);
        }
        else
        {
            TempClient->Socket->SendBuf(Msg,19);
            n=10;
        }
    }
    Terminate();
}
 
VCL 的許多元件並不是 Thread Safe 的,也就是說,你不能執行緒裏 直接使用不具多緒安全的 VCL 元件。 你的程式有很多問題,正常網路程式的架構思維方式如下: 一、如果使用 VCL 元件,沒有必要時最好不要用執行緒,大部份的 問題都可以用單緒來解決。 二、確定你了解多緒程式的寫法,例如同步物件(或多工器)的用法,以 及執行緒間的溝通方式。 二、除了少數的例外(具備多緒安全性質者)在執行緒中使用 VCL 元件, 必須以 TThread 中的 Synchronize 的方法呼叫。 三、執行緒間的溝通方式也有很多種,如果在程式第一次跑到就可以確定 在往後不會更動的資訊,儘量使用執行緒內的物件,不要用其他複雜的 方法。
系統時間:2024-04-29 22:29:01
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!