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
[73773] Re:Thread를 사용한 Idtcpclient 수신부 만들기가 문제가 있네요
정성훈.해미 [sage5nor] 4351 읽음    2016-07-27 13:25
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 수신부 만들기가 문제가 있네요 초초초보 3802 2016/07/26
73773     Re:Thread를 사용한 Idtcpclient 수신부 만들기가 문제가 있네요 정성훈.해미 4351 2016/07/27
73793         Re:Re:Thread를 사용한 Idtcpclient 수신부 만들기가 문제가 있네요 초초초보 4432 2016/08/08
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.