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);
: }
: }
: }
: }
:
: