|
오랜만에 뵙습니다 희성님..
제가 1주일 넘게 아픈 바람에 회사도 쉬고, 병석을 지키고 있습니다.. ㅋㅋ(덕분에 핑계로 푸욱 쉽니다...)
여기 게시판도 간간히 와서 보고 했었습니다. ^^.
TCP/IP통신을 하시든, RS232C통신을 사용하던지 간에 통신에 관련된 함수들은 필수적으로 쓰레드 돌아갑니다.
언제 데이타가 수신될지, 아무도 모를 가능성이 크기 때문이죠..
그래서 항상 수신 쓰레드가 하나씩 돌아가면서 데이타를 받아주게 됩니다. 버퍼에다 쌓아두는 거죠...
메인 프로그램은 버프를 조사하고, 버프에 데이타가 있으면 처리를 해주게끔 해주면 되죠..
그러나 경우에 따라서는 입력에 바로 반응해야 하는 형태도 있습니다. 이런 경우 콜백 함수로 처리해 두면
원활히 처리할 수 있습니다.
윈도우 프로그램에서 기존의 도스 형태처럼 생각하시면 안됩니다. 도스는 싱글 태스크라 현재 돌고 있는 프로그램 하나만 생각해서 코딩하면 되지만, 윈도우는 그렇지 않지요? 심지어는 자기자신이 몇 개가 실행될지도 모릅니다.
또한 RS232C처럼 COM포트라는 시스템에 한정적이 자원(리소스)를 사용할 때는 주의를 기울여야 합니다. 다른 프로그램이 그 리소스를 쓰려고 할 지 모르니까요.. 프린터를 다룰때에도 리소스라는 면에서 주의해야 하는 점들이 있습니다.
지적하신 점처럼 오래도록 돌아가야 되는 루프구문은 쓰레드로 처리해 줘야 됩니다.
아니면 다른 프로그램에 제어권을 넘겨주지 못하기 때문에 응답없음 이라는 형태의 반응을 보게 됩니다.
짧게 걸리는 루프가 아닌 이상 쓰레드나 그외의 방법으로 점유율 100%를 피해야 합니다.
그러나 아래 예에서처럼 비트맵 데이타 몇라인 처리한다고 그리 고민할 필요까진 없습니다. 피씨가 원체 빨라져서...ㅋ
조금 여러가지 말을 해서 글이 어수선해졌습니다만,
통신은 당연히 자신의 쓰레드를 가져야 하며, 메인프로그램은 메인쓰레드로 동작해야 한다는 겁니다.
아래의 드로잉은 또한 캔버스에다 그려주고 있기 때문에 Repaint에 지워집니다. 샘플 코드라는 거죠..
paint루틴에 넣어둘 수 있는 코드로 개조가 필요합니다.
물론 버프를 계속적으로 그려도 됩니다만, 버프에 데이타가 들어오고 진행상태이면 문제가 발생하겠죠?
절반은 현재데이타이고 절반은 이전데이타 같은...그런 상황도 생각해 볼 수 있겠죠?
그게 실시간 데이타가 업데이트 되는 형태로 보여지는게 맞다면야... 상관 없지만...^^..
참 그건 그렇고 지난 게시물에 자료실의 RS232C소스가 잘 안되신다고요?
자료실이나 컴포넌트/라이브러리에 최보현 이란 이름으로 검색해 보시기 바랍니다.
최보현 님이 올려두신 RS232C소스를 찾으실 수 있을 겁니다.
그게 제 기억으론 점유율 100%가 되는데, 수신 쓰레드내의 while문 안에 Sleep(10); 한줄 넣어주면 1%대로 떨어집니다.
찬찬히 살펴보시면 많은 걸 배울 수 있는 소스입니다. 받으셔서 테스트 하면서 공부해보시기 바랍니다.
그럼 새해에도 즐프~ 하시길 기원합니다.
아웅..몸이 안좋은 관계로... 물러갑니다...
이희성 님이 쓰신 글 :
: Graphics::TBitmap *pBitmap = new Graphics::TBitmap();
: Byte *ptr;
: try
: {
: pBitmap->LoadFromFile("C:\\Program Files\\Common Files\\Borland Shared\\Images\\Splash\\256color\\factory.bmp");
: /// 이렇게 파일에서 읽어오는 것 말고 네트윅으로 들어온 데이타를 사용하면 되겠죠..한라인씩 아래 loop처럼
: /// 복사해주면 되지 않을까요..
: for (int y = 0; y < pBitmap->Height; y++)
: {
: ptr = (Byte *)pBitmap->ScanLine[y];
: for (int x = 0; x < pBitmap->Width; x++) ptr[x] = (Byte)y;
: }
: Canvas->Draw(0,0,pBitmap); /// 드로잉 하겠죠?
: }
: catch (...)
: {
: ShowMessage("Could not load or alter bitmap");
: }
: delete pBitmap;
:
: 위의 소스는 외랑님이 주신 소스입니다.. 이해가 안가는 부분이 있습니다
: FOR문 안이 이해가 가질 않습니다 TCP로 데이타를 전송받을건데...
:
: 저렇게 프로그램을 하면 FOR문때문에 저걸하는동안 다른 데이타를 전송받지 못하지않나여..?
: 저프로그램이 실행되는동안 계속해서 어떤 데이타를 보내야 하기 때문입니다..
:
: 아니면 폼을 따로 만들어 포문으로 돌려야 하나여? 그것도 쉬원치 않으면 타이머를 이용해 값을 받아야 하나여?
: 그폼만 아무것도 못하는건지 아니면 전체프로젝트가 아무것도 못하는건가요?
|