|
소켓에서 영상 데이터를 가져오면 버퍼에 쌓아놓습니다.
1 frame의 데이터가 쌓이면 이것을 가져다가 디코딩해서 화면에 뿌리는 로직을
스레드로 구성하고 있습니다. 일반적으로 그렇게 하는 것 같더군요.
버퍼에 1 frame의 정보가 다 쌓여 있으면 스레드를 활성화 시키고 화면에
그리는 로직이 끝나면 lock상태로 떨어지게 만들고 싶습니다. (suspend <-> resume 이 아니구요)
소켓에서 데이터를 채우는 부분과 화면에 그리는 부분이 서로 아구가 맞게 돌아가야 하니까요..
TEvent가 그런 역할을 해주는 것 같은데...어떻게 구성해야 하는 지 잘 모르겠습니다.
다음은 제가 코딩하는 부분의 대충의 얼개를 적은 것입니다. 맞는 것인 지 조언 바랍니다.
[소켓 관련 클래스]
TEvent Event; // Global variable
....
socket->readbuf(....);
if ( FrameComplete() ) // 1 frame 데이터가 모두 들어오면
Event->SetEvent(); // Display용 Thread에 event가 발생함을 알린다..
....
[Display용 Thread]
extern TEvent Event;
CMyTheread::Execute()
{
while(!Terminated) {
Event->WaitFor(100); // Event가 발생함을 기다림.
DrawImage(); // 화면에 그리는 루틴
}
}
* 사실 위의 로직은 MFC에서 운용되던 로직을 그대로 C++ Builder로 옮긴 것인데... MFC에서는
스레드를 위한 별도의 클래스를 생성하는 것이 아니라 특정 함수를 스레드로 지정하고 이것을
실행하는 조금은 다른 형식을 취하고 있구요..조금 다른 것 같고..
* 그리고, MFC에서는 CEvent라는 클래스가 TEvent같은 역할을 하는데 ... WaitFor()라는 함수
역할을 Lock()이라는 함수가 수행하게 됩니다. CEvent::Lock()함수는 infinite하게 기다리는데
반해 WaitFor()는 무조건 일정 시간을 넣어 주어야 하는군요. 물론 event의 발생 주기가 약 30ms로
예상은 되지만 명시적으로 얼만큼 기다리라고 적어주기가 좀 그런데... 올바른 방법인 지도 모르
겠구요.. MFC처럼 다른 곳에서 Lock()을 풀어줄 때까지 무한정 기다리는 것이 올바른 것인지,
특정시간만큼 기다리고 그냥 진행하는 것이 올바른 것인 지도 코멘트 바랍니다. 왠지 특정 시간을
지정하는 것이 떨떠름 합니다. ^^;;
* 그리고, 상기의 함수들이 thread의 suspend/resume은 하지 않는 것으로 아는데 혹 잘못 알고
있으면 코멘트 바랍니다. 매순간 들어오는 이미지를 처리하는 것이 스레드를 suspend/resume하는
것보다 잠깐씩 holding시키는 것이 더 효과적일 것으로 보여지기 때문입니다.
쓰다보니 좀 많은 양이 되어버렸는데 읽어 주셔서 감사하고, 답변 주시면 더더욱 감사...
sqrt(감사~)
|