제목처럼 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);
}
}
}
}
|