C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[49435] Re:RS232 통신 프로그램 관련 질문요~~
아리랑 [interest] 1795 읽음    2007-05-29 15:49
정답은 아니지만...  Sleep(1) 위치를 바꿔보십시요.
보아하니 WaitCommEvent() 가 블럭되는게 아닌듯하니 Sleep()이 없으면 CPU 잡아먹는건 당연한거구요.
Sleep의 인자가 Milliseconds 이긴하나 윈도우의 타임스케쥴이 아마도 최소 70대 Milliseconds로 알고 있습니다. 뭐 이것보다 더 정교한 타이머로 멀티미디어타이머든가 있다고하지만..
어쨋든 CommEvent의 지속적인 발생시는 최소한 Sleep이 듣지 않게 시도 해 봄직합니다.

결과를 테스트 해 볼 수 있는상황(다른 원인을 찻아볼 수 있는 소스가 없으므로)이 아니므로 님의 글에 있는 소스상으론 아마 최선의 방법인듯합니다.

if(!dwEventMask)
{
    Sleep(1);
    continue;
}

허접 님이 쓰신 글 :
: 안녕하세요..
: 허접입니다..
: 전에, 한번 이곳에 질문을 올려, 해결한 문제인데, 그것과 비슷하지만 다른 문제점이 발생해서요..
:
: 소스를 올려드리자면, (통신 쪽만) 다음과 같습니다..
:
: void __fastcall TRS232CRxThread::Execute()
: {
:     DWORD   dwEventMask;
:     DWORD   dwErrorFlags;
:     COMSTAT CommStatus;
:
:     while(!Terminated)
:     {
:
:         dwEventMask = 0;
:         Sleep(1);
:         //--- 통신 버퍼의 이벤트를 기다린다
:
:     WaitCommEvent(myRs232c->hmyPort, &dwEventMask, &myRs232c->evnRead);
:         if(!dwEventMask) continue;
:
:         EnterCriticalSection(&myRs232c->myCriticalSection);
:         if(myRs232c->hmyWnd)
:         {
:             if(dwEventMask & EV_RXCHAR)
:             {
:                 //------------ 수신버퍼에 데이터 문자가 수신 되었을 경우
:                 ClearCommError(myRs232c->hmyPort, &dwErrorFlags, &CommStatus);
:                 SendMessage(myRs232c->hmyWnd, UM_EVN_RXCHAR, CommStatus.cbInQue, 0);
:             }
:             if(dwEventMask & EV_RXFLAG)   SendMessage(myRs232c->hmyWnd, UM_EVN_RXFLAG, 0, 0);
:             if(dwEventMask & EV_TXEMPTY)  SendMessage(myRs232c->hmyWnd, UM_EVN_TXEMPTY, 0, 0);
:             if(dwEventMask & EV_CTS)      SendMessage(myRs232c->hmyWnd, UM_EVN_CTS, 0, 0);
:             if(dwEventMask & EV_DSR)      SendMessage(myRs232c->hmyWnd, UM_EVN_DSR, 0, 0);
:             if(dwEventMask & EV_RLSD)     SendMessage(myRs232c->hmyWnd, UM_EVN_RLSD, 0, 0);
:             if(dwEventMask & EV_BREAK)    SendMessage(myRs232c->hmyWnd, UM_EVN_BREAK, 0, 0);
:             if(dwEventMask & EV_ERR)      SendMessage(myRs232c->hmyWnd, UM_EVN_ERR, 0, 0);
:             if(dwEventMask & EV_RING)     SendMessage(myRs232c->hmyWnd, UM_EVN_RING, 0, 0);
:             if(dwEventMask & EV_RX80FULL) SendMessage(myRs232c->hmyWnd, UM_EVN_RX80FULL, 0, 0);
:         }
:         LeaveCriticalSection(&myRs232c->myCriticalSection);
:     }
: }
:
: 소스의 11번째 줄에 Sleep(1) 함수가 있죠.
: 이 Sleep() 함수를 쓰기 전에는 프로그램을 돌리면 CPU 점유율이 100% 까지 올라가는 사태가 벌어졌습니다.
: 다행히도 도움을 주셔서 Sleep() 함수를 사용한 후에는 CPU 점유율이 극단적으로 치솟는 사태는 없어졌습니다.
: 그런데 문제는 기존에 데이터를 받아와 처리하는 부분의 속도가 1/3로 줄어들었다는 것입니다.
: 왜 그런지, 무엇때문에 그런지, 도통 알수가 없습니다.
: 왜 그런건지 알려주세요..
: 너무 질문이 막연한건가요?  ㅠ.ㅜ
: 죄송합니다.

+ -

관련 글 리스트
49374 RS232 통신 프로그램 관련 질문요~~ 허접 1603 2007/05/25
49435     Re:RS232 통신 프로그램 관련 질문요~~ 아리랑 1795 2007/05/29
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.