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
[73793] Re:Re:Thread를 사용한 Idtcpclient 수신부 만들기가 문제가 있네요
초초초보 [] 4610 읽음    2016-08-08 17:09
답변 진심으로 감사드립니다.

임시로 만든 코드를 정성훈님께서 조언해 주신대로 수정해서 다시 테스트 해봐야겠습니다.

다시한번 감사드립니다.


정성훈.해미 님이 쓰신 글 :
: IdConnectionIntercept 콤포넌트를 이용해서 한번 해 보세요.
:
: IdConnectionIntercept는 4개의 이벤트를 가지고 있습니다.
:
: OnConnection
: OnDisconnection
: OnReceive
: OnSend
:
: IdTCPClient1의 Intercept에 연결한 후
: IdConnectionIntercept의 OnReceive 이벤트에 코딩을 해 주면 됩니다.
:
: 예)
: IdConnectionIntercept ConnIntercept;    // 인디 클라이언트 선언부에 추가합니다.
:
:
: IdTCPClient1 생성시
:
: ConnIntercept = new IdConnectionIntercept(NULL);    //인터럽트도 생성해 줍니다.
: IdTCPClient1->Intercept = ConnIntercept;    // 클라이언트에 인터럽트를 연결합니다.
:
: ConnIntercept->OnReceive  = OnReceive;    // 인터럽트 수신 이벤트를 연결합니다.
:
:
:
: // 수신 이벤트 함수
: void __fastcall sockCthread::OnReceive(TIdConnectionIntercept *ASender, TIdBytes &ABuffer)
: {
:     // 수신데이터 처리
:
:     // 한번에 데이터를 처리할 경우
:     unsigned char   Buffer[8192];
:     for(int i=0; i<ABuffer.Length; i++)   Buffer[i] = ABuffer[i];
:     DataBufferProcess(Buffer, ABuffer.Length);   // DataBufferProcess함수는 임의로 이름지은 예제입니다.
:
:     // 1바이트씩 처리할 경우
:     for(int i=0; i<ABuffer.Length; i++)    {
:         unsigned char   Buffer = ABuffer[i];
:         DataProcess(Buffer);                                 // DataProcess함수는 임의로 이름지은 예제 입니다.
:     }
: }
: 이렇게 해주면 되실 듯 합니다.
:
: 그리고 쓰레드의 Execute()는 단순히 클라이언트 자동 재접속용으로
: 구현하시면 되지 않을까요?
:
:
:
:
: 초초초보 님이 쓰신 글 :
: : 제목처럼 IdTcpclient 컴포넌트를 사용해서 장비와 PC간에 통신을 하려고 합니다.
: :
: : PC에서 송신하고 장비를 통해서 리턴을 받는것 까진 확인을 했습니다.
: :
: : 문제는 수신부인데 단일로는 확인을 했지만 지속적으로 모니터링 해야하기에 Thread를 사용하려합니다.
: :
: : Thread에서 버퍼에 데이터가 있는지 체크하고 있으면 윈도우 메시지를 사용해서 전달하는 방법으로 구현을 했는데
: :
: : 데이터 수신이 한번만 오더라도 소켓의 데이터를 읽지 않으면 계속 윈도우 메시지가 날라오는 문제가 있습니다.
: :
: : 이런 구조는 문제가 있는것 같아서 다른 시리얼 통신 소스코드를 봤더니 WaitCommEvent 함수를 사용해서 데이터가 수신될때만 처리하도록 했더군요.
: :
: : 데이터 사이즈가 메시지를 보낼 조건을 수신버퍼의 사이즈가 바뀔때로 조건을 바꾸는것도 생각해봤는데 이건 문제 읽기랑 같이 쓰다보면 문제가 있을듯 하구요.....
: :
: : 고수님들의 조언부탁드립니다.
: :
: : 아래는 제가 만든 수신 Thread 입니다.
: :
: :
: : void __fastcall sockCthread::Execute()
: : {
: : 	//---- Place thread code here ----
: : 	IdTCPClient1->ReadTimeout = 100;
: : 	while(!Terminated)
: : 	{
: : 		if (IdTCPClient1->Connected())
: : 		{
: : 			if (!IdTCPClient1->IOHandler->InputBufferIsEmpty())
: : 			{
: : 				PostMessage(m_hWnd, WM_COMM_ETHERNET, 0, 0);
: : 			}
: : 		}
: : 	}
: : }
: : 

: :

+ -

관련 글 리스트
73769 Thread를 사용한 Idtcpclient 수신부 만들기가 문제가 있네요 초초초보 3967 2016/07/26
73773     Re:Thread를 사용한 Idtcpclient 수신부 만들기가 문제가 있네요 정성훈.해미 4522 2016/07/27
73793         Re:Re:Thread를 사용한 Idtcpclient 수신부 만들기가 문제가 있네요 초초초보 4610 2016/08/08
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.