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
[40904] Re:[재질문] TThreadList를 사용해서 Client로 데이터를 보내는데요..
황경록 [mpbox] 1505 읽음    2005-07-06 19:02
질문1) 에 대한 답변입니다.

Lock() 함수는 Unlock() 함수와 페어(pair) 입니다.

try __finally 를 사용하는 이유는 Lock() 이후 처리를 수행한 후 Unlock() 을 수행하지 못하는 경우
리스트가 lock 걸린 상태로 남아 있기 때문에 문제가 발생합니다.

따라서 try __finally 를 사용해서 코드 중간에 exception 이 발생했을 경우에서 __finally 블럭의 unlock() 을
시켜 주기 위한 것입니다.

질문2) 는 CommandHandler 를 사용하지 않는 경우 클라이언트에서 전송되어진 리딩에 대한 이벤트는
OnExecute 로 집중되는 것입니다. 따라서 OnExecute 에 처리를 해주시면 되겠습니다.
흐~ 근데 사실 이부분은 저도 안해본거라 ^^.... 근데 맞을 겁니다! -_-;;


★래미★ 님이 쓰신 글 :
: 질문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에서는 동기화가 자동으로 이루어지나요?? ★래미★ 960 2005/07/06
40892     Re:[질문] TThreadList에서는 동기화가 자동으로 이루어지나요?? 황경록 1656 2005/07/06
40899         [재질문] TThreadList를 사용해서 Client로 데이터를 보내는데요.. ★래미★ 1220 2005/07/06
40904             Re:[재질문] TThreadList를 사용해서 Client로 데이터를 보내는데요.. 황경록 1505 2005/07/06
40914                 넘넘 감사합니다^^ ★래미★ 875 2005/07/07
40893         감사합니다^^(별냉무) ★래미★ 740 2005/07/06
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.