기본 콘텐츠로 건너뛰기

2월, 2007의 게시물 표시

문제, 방법론

어제 진행중인 프로젝트에 3개의 기능을 추가하였습니다. 각 기능들에 대해 수행 단계를 차례로 기술하고 각 단계에 대해 테스트를 수행하면서 기능을 추가하였습니다. 기능을 추가하고 나서 여유를 가지고 이런 저런 생각을 하다가 과연 기능을 수행하기 위해 내가 채택한 방법이 올바른 방법일까?하는 생각이 들었습니다. 물론 구현한 방법은 프로젝트에 필요한 기능을 수행합니다. 그러나 채택한 그 방법이 프로젝트에 최적의 방법인지를 고찰해 보지 않았습니다. 이제껏 진행한 프로젝트들에서도 이러한 고찰을 해보지 않았습니다. 이것 말고 다른 더 좋은 방법이 있지는 않을까 하는 생각을 왜 해보지 않았을까요? 이것 말고 다른 방법은 없을까?라는 생각. 기능을 구현하는데 바빠 그런 한 단계 위에서 바라보는 그런 생각을 해보지 못했습니다. 흔히 우리는 어떤 문제가 주어졌을때 그 문제을 풀 생각만을 하고 앞뒤도 돌아보지 않고 연필을 들고 노트에 문제를 풀어나가기 시작하곤 합니다. 하지만 무작정 문제를 풀어나가기 전에 그 문제에 해답은 있는지 한번쯤 생각해 보아야 하지 않겠습니까? 해답 없는 문제를 풀려고 해봐야 죽을때 까지 답을 찾지 못할것입니다.

CView의 소멸.

이번 프로젝트에 폼뷰에 Crystal Edit를 올려서 사용하기로 결정하고 CodeProject에서 Crystal Edit 소스를 다운 받았습니다. 이리 저리 해서 드디어 폼뷰에 올리는것을 성공했습니다. 허나 문제가 발생하기 시작했습니다. Crystal Edit에 키가 먹지 않는것입니다. 이런 문제는 제가 개인적인 프로젝트를 진행할때도 발생한 문제였습니다. 이 문제는 인터넷의 힘으로 해결했습니다.(WM_GETDLGCODE) 다 해결했다하고 프로그램을 종료하는데 에러가 발생하는게 아니겠습니까! 이전에는 이런 문제가 발생하지 않았었는데... Crystal Edit를 올리고 나서 발생한 문제이니 Crystal Edit에 문제가 있을거라 생각하고 몇시간을 버그를 잡는 허비 했습니다만 눈만 아플뿐 버그를 잡지는 못했습니다. 마지막 심정으로 멤버 변수를 멤버 포인터 변수로 수정하고 메모리를 할당하고 Crystal Edit를 생성했습니다. 그랬더니 프로그램 종료시 에러가 발생하지 않는것이었습니다. 이렇게 문제는 해결했으나 그 원인을 알아야 겠기에 Crystal Edit의 클래스들의 소멸자에 메시지를 띄우게 하고 역시 폼뷰의 소멸자의 시작에 메시지를 띄우게 했습니다. 소멸되는 순서를 볼려고 한거죠. 그랬더니 Crystal Edit가 종료되고 그 소멸자도 실행한뒤에 폼뷰의 소멸자가 실행되는 것이었습니다. 일반적으로 클래스의 멤버 변수는 클래스의 소멸자에서 소멸하게 되는데 이번 현상으로 이러한 순서가 지켜지지 않아서 그렇게 되는 것이었습니다. Crystal Edit의 클래스는 CView를 상속하고 있었습니다. 그럼 CView는 윈도우가 종료될때 그 소멸자도 함께 불려진다는 말이 되는데.... Crystal Edit는 폼뷰의 멤버 변수이니까 폼뷰의 소멸자에서 다시 한번 소멸자가 불려지게 되는것입니다. 그래서 에러가 발생하게 되죠.

DLL의 데이터 공유

dll의 프로세스간 데이터 공유를 위해서는 data_seg pragma를 사용한다. 이때 dll의 def 파일에 데이터 공유 섹션을 지정해야 한다는 것을 잊지 말도록.. (오늘 이거 땜에 또 삽질했다. -_-;;) 데이터 공유 섹션 지정 #pragma data_seg(".CACHE") HANDLE g_hCacheFile = INVALID_HANDLE_VALUE; #pragma 섹션 정의 (def 파일에) SECTIONS .CACHE Read Write Shared 이렇게 하면 g_hCacheFile은 이 dll을 로딩한 모든 프로세스에서 공유해서 사용할 수 있습니다.

[펌]Profiler 사용법

Profiler란 - 퍼옴(MadChick) - 비주얼스튜디오에서 제공하는 Application의 performance tuning을 위한 툴중 하나입니다. 가령 프로그램을 졸라 열심히 만들어놨더니 무지하게 느린데 도대체 어디서 이렇게 느려지는지 알수가 없으면 정말 미칠 노릇이죠. 이때 시간을 가장 많이 잡아먹는 함수, 또는 비효율적인 코드부분등을 찝어낼수 있도록 도와주는 놈이 Profiler라는 놈입니다. Profiling은 Function Profiling, Line Profiling 두가지가 있습니다. Line Profiling은 담에 하기로하고, 먼저 Function Profiling 사용법을 알아보겠습니다. 메뉴의 Project/Setting...을 열어 Link tab에 Enable Profiling이라는 체크박스를 체크합니다. 프로젝트를 다시 빌드합니다. Build 메뉴의 맨끝에 있는 Profile...을 선택합니다. 다이얼로그에 보면 Profile Type이 몇가지 나옵니다. 이중에 Function timing을 선택하고 OK를 누르면 실행됩니다. (이때, 실행파일이 있는 폴더에 *.map파일이 반드시 있어야 합니다.) 종료후에 Output창 맨끝 tab에 있는 Profile탭을 열면 결과를 볼수 있습니다. 여기까지는 exe파일의 profiling에만 해당되는 사항입니다. 다음은 dll의 profiling방법입니다. 위 단계의 3번까지는 dll도 똑같습니다. (dll과 exe모두 Enable Profiling상태로 빌드하고, exe가 ActiveProject가 되어있어야 합니다.) 일단 아래와 같은 내용의 profdll.bat파일을 만듭니다. copy %1.dll save prep /OM %1.dll copy %1._ll %1.dll profile /I %1 /O %1 %2 copy save %1.dll prep /M %1 plist %1 comm

dll 디버그용 릴리즈용 def 만들기

지크님의 블로그 | 지크 http://blog.naver.com/kji780929/110010052760 MFC dll 보시면 MFC42.dll과 MFC42D.dll이 있죠? D가 붙은건 DEBUG 버전의 DLL이예요. 아래는 이렇게 만드는걸 쉽게 하는 방법을 적은것입니다. 오후 1:05 2001-12-13 조경민 MFC DLL Debug/Release 구분해서 하기 ============================================================ Test.DLL 프로젝트를 만들면 Test.def라는 파일이 있다. 디버그 버전을 위해 이를 Testd.def로 바꾸고 내부에 ; Test.def : Declares the module parameters for the DLL. LIBRARY "Testd" <- d를 붙여준다. DESCRIPTION 'Testd Windows Dynamic Link Library' <- d를 붙여준다. EXPORTS ; Explicit exports can go here 그리고 Project/Setting에서 Debug에 대해 Link탭에서 Debug/Test.dll을 Debug/Testd.dll로 바꾼다. 그리고 아래 def 연결을 /def:test.def를 /def:testd.def로 바꿔준다. batch Build All을 해서 Debug/testd.lib Debug/testd.dll Release/test.lib Release/test.dll 를 얻는다. 클라이언트는 위의 파일들을 받아서 프로젝트 폴더에 놓기만 하면된다. 클라이언트에서 쓸 수 있게 배포용 헤더파일(h)에 #ifndef _BRO_FSMONITOR_DEVELOP // test 클라이언트에서 쓰는 모드 #ifdef _DEBUG #pragma comment(lib,"