답변 진심으로 감사드립니다.
임시로 만든 코드를 정성훈님께서 조언해 주신대로 수정해서 다시 테스트 해봐야겠습니다.
다시한번 감사드립니다.
정성훈.해미 님이 쓰신 글 :
: 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);
: : }
: : }
: : }
: : }
: :
: :