C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[40899] [재질문] TThreadList를 사용해서 Client로 데이터를 보내는데요..
★래미★ [jackey9] 1219 읽음    2005-07-06 18:25
질문1)

아래와 같이 TThreadList를 써서 각 클라이언트에 데이터를 보내려고 합니다.
별 문제 없이 보였는데..
황경록님 말씀 중에.. try{  }__finally{  }
요 부분을 참고해서 이걸 넣어야되나.. 하고 테스트 해봤더니..(아래서 블러킹된거 지우고요..)
처음 한번은 되구요.. 그담엔..
TList* list = thdlist->LockList(); 요 부분에서 블럭되네요..
왜 그런지 궁금해요~~
근데.. 해놓고보니 요건 클라이언트를 하나씩 호출하는 것이라 동기화가 필요없을 거 같기두 해요
아직도 넘 막막하기만 하네요.. ㅠㅠ

//---------------------------------------------------------------------------

void __fastcall TForm1::SendToClient()
{
    //send data
    char sBuf[BUF_SIZE];
    sprintf(sBuf, "Server -> Client Test Message!");

    TThreadList* thdlist = TCPServer->Threads;
    TList* list = thdlist->LockList();
    if(list->List==NULL) return;
    TIdPeerThread* thd;
    TIdTCPServerConnection* con;

//    try
//    {
        for(int i = 0; i < list->Count; i++){
            thd = (TIdPeerThread*)list->Items[i];
            con = thd->Connection;
            con->WriteBuffer(sBuf, BUF_SIZE);        //write

        RichEdit1->SelAttributes->Color = clGreen;
        RichEdit1->Lines->Add (GStack->LocalAddresses->Strings[0]); //local IP
        }
//    }
//    __finally
//    {
//        thdlist->UnlockList();
//    }
    thdlist->UnlockList();
}

//---------------------------------------------------------------------------

질문2)

TCPServer 의 OnExecute() 함수에서는 여러개의 클라이언트가 접속해도
여기서 다 처리가 가능한가요??
아니면 여기서도 TThreadList 이런걸 써야되는지..
제 생각에는 필요없을거 같은데요.. 넘 막연해서 답답해요....
하나에서 열까지 다 모르는지라.. 질문이 넘 초보적이네요 ㅠㅠ

그럼.. 좋은 저녁시간 되세요~~

//---------------------------------------------------------------------------

void __fastcall TForm1::TCPServerExecute(TIdPeerThread *AThread)
{
    if( AThread->Stopped || AThread->Terminated ) return;
    TIdTCPServerConnection *con = AThread->Connection;
    char Message[BUF_SIZE]={0,};
    int iExpectedLen=0, iStackBufSize=0;

    try
    {
        Application->ProcessMessages();
        do
        {
            iExpectedLen = con->ReadFromStack( true, 1000, false );
            iStackBufSize = con->InputBuffer->Size;

            if(AThread->Terminated)
            {
                throw Exception( "Termination Detected!" );
            }

        } while( iStackBufSize < iExpectedLen ); // expected packet size

        if(iExpectedLen > 0){
            con->ReadBuffer(Message, iExpectedLen);
            MessageHandler(Message, AThread);
        }
    }

    catch(const Exception &e)
    {
        RichEdit1->Lines->Add( "Termination Detected!" );
        con->Disconnect();
    }
}
//---------------------------------------------------------------------------



황경록 님이 쓰신 글 :
: TThreadList 는 말 그대로 쓰레드에서 동기화가 필요 없이(?) 사용하도록 만들어진 클래스입니다.
:
: 제가 팁앤트릭에 올린 TZSynchronize 가 바로 TThreadList 사용하는 매커니즘(???)입니다.
:
: Add(), Remove() 등의 함수를 동기화 코드 없이 사용할 수 있구요.
:
: 그러나 결국 ^^:: 이녀석도 그냥 TList 입니다 ^^ TList 에 TZSynchronize 를 넣어둔것(?)과 같은것이죠.
:
: 그래서 사용할 때
:
: TThreadList* pTList;
:
: ...
:
: TList* pList = pTList->LockList()
:
: try
: {
:     pList->Items....
: }
: __finally
: {
:     pTList->Unlock();
: }
:
: 뭐 이런식으로 되는것입니다. ^^
:
: ★래미★ 님이 쓰신 글 :
: : TThreadList* thdlist = TCPServer->Threads;
: : ~~~
: :
: : 여기서 동기화가 자동으로 이루어지는지..?
: :
: : Synchronize를 따로 시켜야되는지..? 궁금합니다
: :
: : 쓰레드 넘 어려운거 같아요 ㅠㅠ

+ -

관련 글 리스트
40890 [질문] TThreadList에서는 동기화가 자동으로 이루어지나요?? ★래미★ 959 2005/07/06
40892     Re:[질문] TThreadList에서는 동기화가 자동으로 이루어지나요?? 황경록 1656 2005/07/06
40899         [재질문] TThreadList를 사용해서 Client로 데이터를 보내는데요.. ★래미★ 1219 2005/07/06
40904             Re:[재질문] TThreadList를 사용해서 Client로 데이터를 보내는데요.. 황경록 1505 2005/07/06
40914                 넘넘 감사합니다^^ ★래미★ 874 2005/07/07
40893         감사합니다^^(별냉무) ★래미★ 739 2005/07/06
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.