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
[71847] Re:Re:Re:[질문] Sleep(100)과 같이 잠깐 쉬는 동안 발생한 다른 이벤트를 받지 못하는 증상..
땅주인 [heaven2] 3690 읽음    2014-10-09 09:29
Sleep(xxx)하는 동안 발생한 이벤트의 유실이 아니라..
이벤트는 발생하나 제가 처리를 잘못했더군요.

최종 처리는 아래와 같이 했습니다.

// 사용 
ComPort1->Send(xxx);
HWait(100);  // 100ms Wait and Event Pumping
ComPort1->Send(yyy);
...


// Global Function : 일정 시간 기다리면서 이벤트는 처리한다. 
void HWait(int iMiliSecond)
{
    int iCnt = iMiliSecond / 50 + ( iMiliSecond %50 > 0) ? 1 : 0;
    for ( int i = 0 ; i < iCnt ; i++ ) {
        Sleep(50);
        Application->ProcessMessage(); // Message Pumping 
    }
}


땅주인 님이 쓰신 글 :
: 답변 감사합니다.
: Timer을 쓰는 것을 고려해 보았는데.. 이벤트 여기저기 로직이 흩어져서 ..
: 아래와 같이 하면 되긴 되는데.. 썩 좋은 방법 같지는 안아서..
:
:
: ComPort1->Send(xxx);
: //Sleep(100);   // 100ms wait
: for ( int i = 0 ; i < 2 ; i++ ) {  // 50ms 2번 Wait.. 단, 그 중간에 유입된 메세지 처리
:     Sleep(50);
:     Application->ProcessMessages();
: }
: ComPort1->Send(xxx);
: 

:
: 이렇게 하면 다른 이멘트가 처리가 되긴 되는데.. 여러번 통신할 때 ProcessMessage()를 과도하게 호출하는 것 같아서.
:
: 이런 사나운 코드 말고 좀더 나은 코드를 찾고 있습니다.
:
: 감사함돠~!
:
:
: 송신영 님이 쓰신 글 :
: : Thread를 사용하기 꺼려지면 Timer를 사용하는게 좋을 것 같은데요.
: : Sleep을 사용하면 그동안 UI는 먹통이 되버리니...
: : 그나마 100msec 정도는 Timer로도 충분할 듯...
: :
: : 땅주인 님이 쓰신 글 :
: : : 환경: RAD Studio XE5 ( C++ Builder XE5)
: : : Component : AsyncPro Component (비동기 Serial Comunication Component)
: : :
: : : ComPort 3개와 동시에 통신 중입니다.
: : : 3개의 Comport 중 하나의 ComPort가 상대방 장비의 동작 속도가 상대적으로 느려서 천천히 Send를 해야 할 상황이라서..
: : : Send하고 잠깐 쉬고 Send하고 이런 식으로 코딩하였습니다.
: : :
: : :
: : : ComPort1->Send(xxx);
: : : Sleep(100);  // wait for while 
: : : ComPort1->Send(xxx);
: : : ...
: : : 

: : :
: : : 이런 식으로 코딩을 했는데,
: : : 문제는 이렇게 쉴 때, ComPort2 / ComPort3의 수신 이벤트(OnTriggerAvail)를 받지 못합니다.
: : : Message Pumping 루틴을 이용해서..
: : :
: : :
: : : ComPort1->Send(xxx);
: : : Sleep(100);  // wait for while 
: : : Application->ProcessMessages(); // Sleep하는 동안 도착한 Event를 처리한다. 
: : : ComPort1->Send(xxx);
: : : ...
: : : 

: : :
: : : 이렇게 처리해도 마찬가지네요. 될 때도 있고, 안될 때도 있는데, 안되는 케이스가 더 많아요(70~90%이상)
: : : Thread로 처리하려니 AsyncPro 자체가 비동기 ComPort라 이것도 애매하네요.
: : : ComPort1->GetBlock(Buffer, Count); // Count가 정확하지 않으면 Exception이 나버리네요.
: : :
: : : Sleep()을 쓰지 않고, 다른 Event가 유실되지 않게 일정 시간을 기다리게끔 할 수 있는 방법이
: : : 있을까요?
: : :
: : : 가령
: : :
: : : ComPort1->Send(xxx);
: : : Wait(100);  // Event를 처리하면서 100ms를 기다린다. 
: : : ComPort1->Send(xxx);
: : : ...
: : : 

: : :
: : : 이렇게 할 수 있는 방법은?
: : :
: : : 감사합니다.
: : :
: : :
: : :

+ -

관련 글 리스트
71824 [질문] Sleep(100)과 같이 잠깐 쉬는 동안 발생한 다른 이벤트를 받지 못하는 증상.. 땅주인 3560 2014/10/02
71836     Re:[질문] Sleep(100)과 같이 잠깐 쉬는 동안 발생한 다른 이벤트를 받지 못하는 증상.. 송신영 4298 2014/10/07
71838         Re:Re:[질문] Sleep(100)과 같이 잠깐 쉬는 동안 발생한 다른 이벤트를 받지 못하는 증상.. 땅주인 3712 2014/10/07
71847             Re:Re:Re:[질문] Sleep(100)과 같이 잠깐 쉬는 동안 발생한 다른 이벤트를 받지 못하는 증상.. 땅주인 3690 2014/10/09
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.