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
[17170] 고맙습니다..해결되었네여..
C처럼 간결하게 [hbom] 1267 읽음    2002-04-03 17:03
ChildThread는 서버에서 accept하는순간
호출이 되구여...
아래 코드를 써서 이벤트 처리를 하는데 시간을 주니 해결 되는군여

Application->ProcessMessages ();

저도 이것 때문에 Sleep을 써보기는 했는데 이런게 있는줄은 몰랐네여
정말 고맙습니다. 언젠가 저도 남에게 도움을 줄수 있는 때가 오겠져 ㅋㅋㅋ
즐프하시고여 즐거운 하루하루되세여...




^^ 님이 쓰신 글 :
: ChildThread 함수가 어디 상에서 실행(호출)되는지 조금 막연하네요. thread 내에서 실행되면 다른 원인이지 싶은데, 만약 쓰레드 내에서 실행되는 것이 아니면 아마도 while 루프가 혼자서 시스템을 독식해서 발생하는 문제 같습니다.
: 이를 해결하는 방법은 시스템에 다른 이벤트를 처리하라고 여유시간을 주어야 합니다. 간단한 방법은,
:     Application->ProcessMessages ();
: 이 함수를 호출하는 것이죠.
: 이렇게 바꾸어 보세요.
: void ChildThread (void* passedThread)
: {
:     ...
:     while( Form6->Proc == true )
:     {
:         ...
:                  if(Form6->Chat_winOpen[num] == false)
:                  {
:                      Form6->Chat_winOpen[num] = true;
:                      Form6->Button2->Click();
:                      Application->ProcessMessages ();
:                  }
:         ...
:         Application->ProcessMessages ();
:     }// end while
:    
: }
:
:
:
:
: C처럼 간결하게 님이 쓰신 글 :
: : 제가 질문을 너무 어렵게 드렸나 보네여...
: : 글구 뭘 숨기려구 그러는건 아닙니다..(뭘 좀 숨길수 있는 실력이 있음 좋겟습니다.)
: : 프로그램의 구조는 뭐 보통 채팅 프로그램하고 같고요
: : 클라이언트하고 서버가 있고...
: : 서버에서는 여러개의 클라이언트의 접속을 처리하고요
: : 아래 코드는 서버의 쓰레드 부분입니다.
: : 아무래도 이부분에 문제가 있어 보이는데 알수가 없네여..
: : 아래에서 채팅메시지가 들어오면 채팅창을 띠우는데 그부분이 문제네여....
: :
: : void ChildThread(void * passedThread)
: : {
: :     int             i;
: :     int             num = (int) passedThread;   // 현재 차일드 소켓과 스레드의 번호.
: :     int             rtval;                      // recv, send 의 Return Value
: :     int             tempi;                      // 막변수
: :     String          Temp;                       // 막변수
: :     String          Temp2;                      // 막변수
: :    
: :     // 소켓 이번트 관련...
: :     WSANETWORKEVENTS event;
: :     WSAEVENT hRecvEvent = WSACreateEvent();
: :     WSAEventSelect( Form6->ChildSocket[num], hRecvEvent, FD_READ | FD_CLOSE );
: :
: :     struct CommonPacket     cpack;
: :     struct ListPacket       lpack;
: :
: :     while( Form6->Proc == true )
: :     {
: :       
: :         WSAEnumNetworkEvents( Form6->ChildSocket[num], hRecvEvent, &event);
: :         if((event.lNetworkEvents & FD_READ) == FD_READ)
: :         {
: :             rtval = recv( Form6->ChildSocket[num], (char *)&cpack, sizeof(CommonPacket),0);
: :             if ( rtval == -1 ) continue;
: :             switch(cpack.command)
: :             {
: :             // 채팅메시지가 들어오면
: :             case COMMAND_CHAT:
: :                 Temp = (AnsiString)cpack.id;
: :                 Temp = Temp + " : ";
: :                 Temp = Temp + (AnsiString)cpack.chat;
: :                 // 채팅창이 열렸는지 검사
: :                 if(Form6->Chat_winOpen[num] == false)
: :                 {
: :                     Form6->Chat_winOpen[num] = true;
: :                     Form6->Button2->Click();
: :                 }
: :                 Form10->Chat_Memo->Lines->Add(Temp);
: :                 cpack.command = COMMAND_CHAT_OK;
: :                 if(send(Form6->ChildSocket[num], (const char *)&cpack, sizeof(cpack), 0)==SOCKET_ERROR)
: :                 {
: :                     wsprintf(msg_buf, "COMMAND_CHAT send error %d", WSAGetLastError());
: :                     ShowMessage(msg_buf);
: :                     closesocket(Form6->ChildSocket[num]);
: :                     Form6->SocketOpened[num] = false;
: :                     _endthread();
: :                 }
: :
: :                 break;
: :
: :             case COMMAND_CHAT_OK:
: :
: :                 Temp = Form3->mydata.id;
: :                 Temp = Temp + " : ";
: :                 Temp = Temp + Form10->Chat_Edit->Text;
: :                 Form10->Chat_Memo->Lines->Add(Temp);
: :                 Form10->Chat_Edit->Text = "";
: : //                Form10->Chat_Edit->SetFocus();
: :                 break;
: :
: :                 // P2P 연결을 해제하겠다는 메시지 송신
: :             case COMMAND_DISCONNECT:
: :                 Temp = (AnsiString)cpack.id;
: :                 for(int i=0; i<Form6->ListView1->Items->Count; i++)
: :                 {
: :                     MyItem =Form6->ListView1->Items->Item[i];
: :
: :                     if(MyItem->Caption ==Temp)
: :                     {
: :                         MyItem->Delete();
: :                         break;
: :                     }
: :                 }
: :
: :                 closesocket( Form6->ChildSocket[num] );
: :                 Form6->SocketOpened[num] = false;
: :                 _endthread();
: :
: :             }// end switch
: :
: :         }
: :         if((event.lNetworkEvents & FD_CLOSE) == FD_CLOSE)
: :         {
: :             closesocket( Form6->ChildSocket[num] );
: :             Form6->SocketOpened[num] = false;
: :             _endthread();
: :         }
: :
: :     }// end while
: :
: :   
: :     _endthread();
: : }
: :
: :
: :  폼을 동적으로 만드는곳
: :  void __fastcall TForm6::Button2Click(TObject *Sender)
: :  {
: :      Form10 = new TForm10(Application);
: :      Form10->Show();
: :  }
: :  이렇게 버튼을 누르면 별 문제 없이 폼이 생성됩니다.
: : 
: : 
: :
: :
: : ^^ 님이 쓰신 글 :
: : : 이렇게만 설명하여 주시면 답변 드리는 입장에서는 아무런 답변도 드릴 수 없습니다. 클라이언트에서 메세지를 받아서 처리하는 부분의 전체내용을 보지 않고는 문제점이 무엇인지 알 수 없습니다. 무엇때문에 숨기실려고 하시나요 ? 소스코드 한라인한라인이 중요한 시대는 지나갔습니다. 지금은 널린 것이 정보이기 때문이겠죠. 현대에 가장 문제가 되는 것은 누가 자신의 입맛에 꼭 맞는 정보를 빠르게 찾아 내는냐가 관건 아닐까요 ?
: : :
: : : 제 생각에는 메세지를 받는 함수 전체를 보는 것이 가장 확실하게 문제점을 파악할 수 있는 방법인 것 같은데, 그게 부담되시면, 현재로서 파악할 수 있는 것은 메세지를 받아서 OnClick 이벤트를 발생하고 난 후에 무엇ㄴ가 잘못 처리하여 발생하는 문제 같습니다.
: : :
: : :
: : :
: : : C처럼 간결하게 님이 쓰신 글 :
: : : : 채팅프로그램을 만들고 있습니다...
: : : :
: : : : 버튼을 클릭하면 폼을 동적으로 생성하는데...
: : : : 직접 버튼을 클릭해서 폼을 만들면 이상이 없습니다.
: : : : 그런데 클라이언트에서 채팅메시지가 들어와서 버튼이벤트를 호출해서 만들면
: : : : 프로그램이 멈춰버린것처럼 되어버립니다.
: : : : 그렀다고 다운이 된건은 아니고 채팅메시지가 오면 폼에 출력이 됩니다
: : : : 그러나 그외의 컨트롤이 안되네여..
: : : : 그러다가 접속이 끊기면 폼이 사라지면서 프로그램이 원래대로 잘 돌아갑니다.
: : : : 그래서 앞의 질문도 그것때문에 올린건데....
: : : : 아직도 해결을 못하고 있네여..ㅠㅠ
: : : :
: : : : 폼을 동적으로 만드는곳
: : : : void __fastcall TForm6::Button2Click(TObject *Sender)
: : : : {
: : : :     Form10 = new TForm10(Application);
: : : :     Form10->Show();
: : : : }
: : : : 이렇게 버튼을 누르면 별 문제 없이 폼이 생성됩니다.
: : : :
: : : : 다음은 버튼 이벤트를 호출하는 곳입니다..
: : : :
: : : : Form6->Button2->Click();
: : : :
: : : : 이렇게 쓰면 폼이 생성되어지지만 다른거는 아무것도 하지 못합니다.
: : : : 무엇이 문제일까요
: : : : 제가 보기에는 문제가 없어 보이는데....
: : : : 고수님들 조금이라도 의심되는 부분이 있으시면 꼭좀 답면좀 주세여
: : : : 아니면 다른 방법이 있다면 알려주시구여...
: : : :
: : : : 즐프하시고 즐거운 하루 되세여..
: : : :
: : : :
: : : : ^^ 님이 쓰신 글 :
: : : : : Windows API에서는 윈두우핸들이라는 넘을 두어 생성된 윈도우(동적, 정적)를 관리하도록 하고 있습니다. 그러나, 빌더에서는 동적으로 생성된 윈도우에 대해서는 자체적으로 관리해 주지를 않습니다. 그렇다고 전혀 접근하는 방법이 존재하지 않는 것은 아닙니다. 빌더에서는 Screen이라는 global class가 존재합니다. 이 클래스는 현재 화면과 관련된 정보를 가지고 있습니다. 자세한 내용은 Screen의 도움말을 참조하시고, 폼에 관련된 것만 말씀 드리면,
: : : : : Screen->Forms [] : 이것이 바로 현재 화면상에 떠 있는 모든 폼을 나타냅니다.
: : : : : 예를 드는 것이 설명하는데, 가장 빠를 것 같군요.
: : : : : [예1] 캡션을 이용하여 폼을 찾고 싶다면,
: : : : : Form *SearchForm (String caption)
: : : : : {
: : : : :     for (short i = 0; i < Screen->FormCount; i++ )
: : : : :     {
: : : : :         if ( String (Screen->Forms[i]->Caption) == caption )
: : : : :             return Screen->Forms [i];
: : : : :     }
: : : : :     return NULL;
: : : : : }
: : : : : [예2] 특정폼이 몇개 떠 있는지 확인하고 싶다면,
: : : : : int CountForm (String formName)
: : : : : {
: : : : :     int formCount = 0;
: : : : :     for (short i = 0; i < Screen->FormCount; i++ )
: : : : :     {
: : : : :         if ( String (Screen->Forms[i]->ClassName ()) == formName )
: : : : :             formCount++;
: : : : :     }
: : : : :     return formCount;
: : : : : }
: : : : : 이렇게 하시면 됩니다.
: : : : : 그래도 이해않되면 리플을 달아 주세요.
: : : : :
: : : : :
: : : : :
: : : : :
: : : : :
: : : : : C처럼 간결하게 님이 쓰신 글 :
: : : : : : 동적으로 생성된 폼이 여러개가 있을 경우 그것을 어떻게 구분하는지...
: : : : : : 내가 얘기하고도 넘 질문이 막연하네여....
: : : : : :
: : : : : : 그러니까 윈도우가 어떻게 그걸 구분해서 메시지를 전달하는지등등
: : : : : : 헉 너무 질문이 어렵군여... 죄송합니다.
: : : : : :

+ -

관련 글 리스트
17081 동적으로 생성된 폼에 대하여.... C처럼 간결하게 853 2002/04/01
17085     Re:동적으로 생성된 폼에 대하여.... ^^ 945 2002/04/01
17107         Re:Re:동적으로 생성된 폼에 대하여....다른 문제가 있어서... C처럼 간결하게 968 2002/04/02
17117             Re:Re:Re:동적으로 생성된 폼에 대하여....다른 문제가 있어서... ^^ 962 2002/04/02
17161                 Re:Re:Re:Re:동적으로 생성된 폼에 대하여....다른 문제가 있어서... C처럼 간결하게 1096 2002/04/03
17163                     Re:Re:Re:Re:Re:동적으로 생성된 폼에 대하여....다른 문제가 있어서... ^^ 1067 2002/04/03
17170                         고맙습니다..해결되었네여.. C처럼 간결하게 1267 2002/04/03
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.