|
현재 장비에서 전송되는 데이터는 버퍼에 저장을 하도록 하셨겠죠??
현재 님의 프로그램이 어떤 식으로 구성되어 있는지 잘 모르겠지만 제가 생각하기에....
장비에서 데이터를 받아들이는 cport thread(전송되는 데이터를 버퍼에 저장하는 단계까지 수행),
버퍼의 데이터를 TStringGrid에 뿌리는 thread(?) 또는 함수
아마 이렇게 되 있을 것 같습니다.
효과적이고 확실하게 데이터를 TStringGrid에 뿌리는 방법은 버퍼를 ping - pong 버퍼로 설계하는 것입니다.
즉, 버퍼를 2개 두고, 한쪽 버퍼가 데이터를 받고 있을 동안 다른 쪽의 버퍼의 데이터로 뿌리고, 그 다음에는 맞바꾸어 처리하고 이런 식이죠..
pseudo 코드는 대략 아래와 같을 겁니다.
struct Buffer {
BOOL readwrite; // readable = TRUE, writeable = FALSE
struct data {
int a;
float b;
char c;
}
} Buffer1, Buffer2;
초기화 readwrite = FALSE; // 처음에는 데이터가 없을 것이므로
receivedatathroughCPORT()
{
if(Buffer1.readwrite == FALSE) {
store receiving data to Buffer1 data pool
Buffer1.readwrite = TRUE;
SendMessage(STRINGGRID_PROCESS); // 이런식으로 MESSAGE를 보내죠
}
else if(Buffer2.readwrite == FALSE) {
store receiving data to Buffer2 data pool
Buffer2.readwrite = TRUE;
SendMessage(STRINGGRID_PROCESS); // 이런식으로 MESSAGE를 보내죠
}
}
processbufferdata() // STRINGGRID_PROCESS 메시지를 받아 처리하도록 설정
{
if(Buffer1.readwrite == TRUE) {
display Buffer1 data to TStringGrid
Buffer1.readwrite = FALSE;
}
else if(Buffer2.readwrite == TRUE) {
display Buffer2 data to TStringGrid
Buffer2.readwrite = FALSE;
}
}
이런 식이면 동작할 겁니다. 제가 실용에서 써먹은 적이 있으니까요. 하지만 실제 어플리케이션에서는 동기화(Synchronization)같은 문제가 있을 수도 있으니 유념하시고요...
마지막으로 CPORT에서 데이터를 받은 후 processbufferdata에 MESSAGE를 날려서 처리하는 것이 가장 좋은 방식일 것 같네요.. processbufferdata에 별도의 thread를 쓰는 것보다는요.
도움이 되었기를....
초보멋진빌더 님이 쓰신 글 :
: 먼저 warship님 라스코니님, 씨크릿님께 감사 드립니다.
: 고수님들때문에 장비제어에 막바지에 왔습니다.
: 장비에서 데이터를 받아 memo에서 확인을 하고 있습니다.
: 무슨 질문을 할 건지 아시겠죠..
:
: 질문은 장비에 데이터가 stx 데이터 etx bcc 로 데이터는 메모장에 표기가 됩니다.
: 데이터는 저번에 말씀드린대로 "100,2000,1500,-1.456,1.550 --------"으로 보내지고 있는데
: 각 데이터 구분은 ","로 char 데이터를 전송하구요.데이터 갯수는 9개입니다.
: 근데 TStringGrid 에다가 이쁘게 정렬을 하고 싶습니다.
:
: 데이터 다운로드는 장비에게 hex 값을 날리면 장비에서 전송되어 오는데
: 버퍼에 저장되는 데이터를 그대로 TStringGrid 에 바로 다운로드 할수는 없나요..??
: 아님 memo 에서 TStringGrid 로 옮기는 법은요..??
:
: 제가 해 봤는데.. 잘안되서리.. ㅜㅜ.
:
: 아시죠.. 제가 초짜라는거.. 저도 계속 해보겠습니다.
|