최근에 매프레임 영상을 출력해줘야 하는 부분에 있어서 여러방법을 시도해보면서 느꼈던 점을 정리한다.

 

일단 나의 상황은 매 프레임 얻어온 영상을 갱신하거나 OpenGL을 Render() 시켜야만 하는 상황이었다.

 

그래서 선택한 사항들은...

 

1. OnTimer() 이용

 

2. Thread 생성

 

3. OnKickIdle()

 

4. 다이얼로그를 modal 말고 modaless로 생성 이었다.

 

 

하지만 여기에는 여러 문제점들이 발생했으니..

 

1. OnTimer() 이용

 

일단 제일 중요한게 퍼포먼스이다.

 

영상이 뚝뚝 끊기고 렉이 생기는데.. 무슨말이 필요한가.

 

테스트 후 바로 삭제!! Pass~

 

 

 

2. Thread 생성

 

일단 Thread 를 생성 후 이벤트 핸들러를 통해 접근 하려고 했지만.. 무슨일인지 모르게 Render() 함수로는 들어가지지만.. OpenGL 화면이 더이상 Render 되지않아 갱신이 되지 않았다. 무슨문제인지는 모르겠다...;; 그래서 Pass~

 

 

 

3. OnKickIdle()

 

Dialog 기반에서 OnIdle() 대신 널리 쓰이는 방법이 OnKickIdle() 이다.

 

이는 SDI 방법에서 주로 쓰는 OnIdle()과 같은기능??을 한다고 본다. (주관적인 생각!!)

 

어째뜬 이를 통해 Render() 시키니 잘~~된다. 정말 기뼜다.

 

하지만... 종료시 무슨 문제인지 모르겠지만, 계속 프로그램이 뻑난다.

 

메모리쪽도 아니고, NULL Pointer 로의 접근도 아니고.. 음... 도대체가 알수가 없었다.

 

이놈때문에 나의 금쪽같은 주말을 날렸지만 결국 해결 못했다... 젠장..!! 역시 Pass~

 

 

 

4. 다이얼로그를 modal 말고 modaless로 생성

 

낙담한 상태로 구글링을 하다가 MFC Dialog 기반일때 Modal 말고 modaless 로 생성하여 Idle() 돌리는법!! 이라고 소개 되어있는 곳을 검색하게 되었다.

 

올레!!!!!!

 

사이트 : http://blog.naver.com/oneofall?Redirect=Log&logNo=60110572078

 

여기서 제시한 방법은..

 

App::InitInstance() 함수내에서

원래는 (다이얼로그 클래스 이름을 CMyDlg 라고 하겠다.)

----------------------------------------------------------------
CMyDlg dlg;
m_pMainWnd = &dlg;
INT_PTR nResponse = dlg.Domodal();
if(nResponse == IDOK)
{
}
else if(nResponse == IDCANCEL)
{
}

return FALSE;

----------------------------------------------------------------

위와 같은 소스로 되어 있는데 이걸

 

CMyDlg * dlg = new CMyDlg;
dlg->Create(다이얼로그 리소스 ID);
m_pMainWnd = dlg;

return TRUE; // 이것을 주의 하자 꼭 TRUE 로 리턴해야 실행하자마자 종료되지 않는다.

 

 

라고 되어있다. (사이트 참조!)

 

이말 즉슨 , Domodal() 하지않고, 동적생성하여 Modaless 상태로 따로따로 생성하면 SDI 처럼 OnIdle()을 사용할수 있다는 말이었다.

 

그리고 종료시 메모리 누수 때문에, App::ExitInstance() 에서 delete dlg; 를 해주라는 친절한 설명까지...

 

 

이제는 OpenGL Render()도 잘되고, 영상도 출력 잘되고.. 너무 만족한다.

 

나같은 실수나 과오를 똑같이 저지르지 말라는 생각에 이렇게 해결되자마자 급 작성중.. 얼마나 열불 터졌으면.. 에효!!

 

그래도 실수하면서 배운다 는 말이 맞기는 한거 같다.

 

 

 

 

젠장.

 

 

Posted by Tommy™
,