|
정답은 아니지만... 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로 줄어들었다는 것입니다.
: 왜 그런지, 무엇때문에 그런지, 도통 알수가 없습니다.
: 왜 그런건지 알려주세요..
: 너무 질문이 막연한건가요? ㅠ.ㅜ
: 죄송합니다.
|