본문 바로가기

Deveolper diary

아무리 Diary지만 너무 일기화 되는거 아이가?

(나중에 따로 포스팅을 하겠지만, 문법 테그를 보고 오신분들은 색이 다른 부분만 참고 하세요!)

상당히 일기같은 기분이구만.ㅡ,.ㅡ;;;

주말 내도록 이리저리 않좋은 몸을 이끌고(좋은적은 또 언제냐...개발자 들이여...몸관리 하라) 돌잔치에 말도 않되는 꿈을 꾸면서 쪽 잠을 잤다.

시간이 월요일을 가리키지만 일단 일요일...꺼를 쓰고 있으니까^^

회사에 나가서 일했다.ㅡ.ㅡ; 음...야근 수당 말고 주말 근무 수당 함 받아 보고 싶었다. ㅎㅎㅎ

WinAPI 를 MFC 로 포팅하는 작업...비슷한거 같지만 완전 구조 자체가 틀리기 때문에 사실 Copy and paste 할만한 대목은 솔직히 중요 알고리즘 함수 정도일까?

사실 능력이 딸려서...작업 속도가 매우 느리다. ㅠㅠ 로드가 어디서 걸리는 걸까? 산만한거 인정... 멍때리는거 인정... 해도 집중해도! 이상하게 느려.ㅡ,.ㅡ; 좀더 바싹 집중하고 쓸때없는 오타를 줄여야 할 듯하다.

90년대 후반 2000년대 초반 쯤? 의 코드인데 유닉스 스타일이라고 우리 팀장님이 말씀하신 신기한 코드

void Fun(a, b, c, d, e, f)
int a,b;
double c,d,e,f;
{
  .....
}

혹시 이런 코드를 본적 있는가.....

처음에 막 모듈별로 붙여넣고 클래스 명만 붙여넣고 컴파일 할 요령으로 작업했다가 5천라인이 넘는 코드를 다시 검사 하는 미친 짓을 한적이 있다.

정말 신기한....함수 대가리(헤더)가 매우 심플하며, 자료형은 꼭 MFC의 이니셜라이져 기법으로 해놨다.

더 웃긴건...자료형만 같다면, a와b의 위치가 변경되도 에러가 없다.

void Fun(b,a, c, d, e, f)
int a,b;
double c,d,e,f;
{
  .....
}

가 가능하다는 말이다. 이거 매개변수 지우고 밑에있는 실 매개변수를 끌어와도 어떤게 맞는 순서인지는 디버그 반드시 해봐야 한다는 것이다.

이 에러덕분에 몇주를 날렸다.

그리고 마감이 늦었지...물론 지금 포팅이 마무리 된것은 아니다만...

이런 C 코드를 이젠 더이상 사용하지 않을거라 생각하기 때문에 여기에 포스팅 한다. 아...물론 혹시라도 이런 코드를 사용 할 수 있다고 해도... 가독성과 유지보수에 매우 않좋은 습관이기 때문에 혹시 이런 버릇을 가진 프로그래머가 있다면 살짝 가드 올려라는 말과 함께 120단 콤보 들어가주길 바란다.

오늘 날 괴롭힌 부분은 단순한 선긋고 사각형 그리고.ㅡ,.ㅡ;

영상처리 쪼~금 해다는 놈이 몇달 포팅하고 컨트롤 가지고 놀았다고 감 없다..... 슬푸다....

분할 된 뷰에서 작은 사각형에 그린 선이 메인 뷰에 매칭되며, 실시간으로 함께 그려지는 것...ㅠㅠ 원 소스를 지키면서 MFC 스타일로 가라! 는 아...능력 부족이 절실히 느껴 진다.

물론 선 만 긋는게 아니라 다른 작업을 함께 하기 때문에 기존 소스의 함수를 사용하였다. 때문에 더 늦었지만...

오늘 고민한 부분은 View에 그리는 작업은 매우 느리기 때문에 화면에 실제로 보여주는 부분을 다른 기법을 많이 사용하다. 예를 들어서 더블버퍼링, 트리플버퍼링 , 그리고 컨트롤은 스레드를 돌려서....

이렇게 DC를 갱신하는 부분이 느리기 때문에 무작정 분할된 뷰를 갱신하는 것 자체가 오버해드가 아닐까 생각이 들었다.

물론....시간없어서 테스트는 않해봤는데

11일에 선거를 핑계로 쉬는날 대대적인 집 청소와 만일 프로젝트가 이전에 정리가 좀 되면 이 부분을 반드시 테스트 할 생각이다. View를 그리는 부분이 얼마나 많은 오버해드를 발생시키는 것인지..

또한 팀장님이 알려주신 코드(이 코드 인터넷에서 보고 적용을 했다가 병신같이 음? 머야 어떻게 하는거야 ? 하면서 지웠던.ㅠㅠ)

n개의 view가 있을때 다른 View의 DC를 가져오는 방법... 단순히 GetDC를 사용하면 될꺼 같지만, 메인뷰는 해봐야 죽는다. 100% 이건  경험이다.

많이들 격어 봤을 것이다.

CMFCView* pView = (CMFCView*)pMain->GetActiveView();
pView->Invalidate(false);

오타 있을 수 있지만 잠온다.ㅡ,. 빨리 끝내야 한다.

이 구문...가능한 구문이지만 갱신? 않된다. 절대 않됨...

왜냐면 지금 활성화 되어 있는 뷰는 저 코드를 처넣은 View이기 때문이다. (그게 뷰든 Dialog든 관계 없다. DC를 말하는 것이다.)

때문에 귀찬은 짓을 해줘야 하는데 물론 논리적으로 일리가 있다.

POSITION pos = pDoc->GetFirstViewPosition();
CMFCMainView* ViewDC = (CMFCMainView*)pDoc->GetNextView(pos);
CClientDC viewdc(ViewDC);

포지션이라는 자료형을 이용하여 Document 로 접근하여 첫 번째 뷰 포지셩을 얻어온다. 일단 매인 뷰는 무조건 첫 번째다.

만일 분할뷰를 n개 사용하였다면? MainFrame에 정의된 순서대로이다.

저 상태에서 View 포인터를 가지고 온다음, CClientDC를 이용하여 뷰의 핸들을 넘기면 메인 뷰의 DC를 가지고 올 수 있는 것!

Invalidate 함수도 먹는다.

첫 번째 구문은 사실 잘 생각만 해보면 모순이 생기는 부분이다. 만일 코드를 치고 있는 부분이 다른 뷰라면, 그 코드를 훌고 내려가게 되면 활성화된 뷰는 코드가 쳐저 있는 부분일 것이다.

내가 생각하기엔 C++을 기반으로 한 MFC는 C와 동일하게 포인터 케스팅이 자유롭고, 자바와 같은 객체지향 언어이기 때문에 첫 번째 구문과 같이 포인트 케스팅이 자유롭기 때문에 에러는 나지 않기 때문인듯 하다.

어째든 뷰를 자유자제로 움직여야 그만큼 쓸때없는 우회가 없을 듯 하다.

오늘 마무리!