2010년 3월 25일 목요일

MFC: Common Dialog

Common Dialog(공통 다이얼로그)

The Common Dialog is..
 ▶ Windows 운영체제에서 기본으로 제공하는 Dialog Box로 Application에서 필수적으로 사용되는
    기능들을 구현해 놓은 Dialogs.
 ▶ 이를 사용하기 위해서는 common dialog class의 객체를 생성해야 함.
  - Common Dialog Class는 CCommonDialog class에서 파생됨.
  - 사용: Common Dialog 객체를 생성한 후, DoModal()멤버 함수로 호출하면 됨.
          (Find/Replace의 경우는 예외로 Modeless방식으로 작성할 수도 있음)
 ▶ 종류
 Type Dialog Class
 File Dialog Box (Open/Save)
 Font Dialog Box
 Color Dialog Box
 Page Setup Dialog Box
 Print Dialog Box
 Find/Replace Dialog Box
 OLE Dialog Box
 CFileDialog
 CFontDialog
 CColorDialog
 CPageSetupDialog
 CPrintDialog
 CFindReplaceDialog
 COleDialog

Example: CFileDialog
 xxx::OnBtnClickedxxx()
 {
    CFileDialog aaaa(TRUE,"txt","*.txt",OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST,
                     _T("EXE Files(*.exe)|*.exe|All Files(*.*)|*.*||"),this);
    if(aaaa.DoModal()==IDOK)
    {
       ....
     }
  }


CFileDailog(
 BOOL bOpenFileDialgo,        //TRUE면 '열기'모드, FALSE면 '저장'모드
 LPCTSTR lpszDefExt = NULL,   //저장모드일 경우 입력받은 파일명에 덧붙일 확장자 명시
                              //열기모드일경우는 이 값이 무의미함.
 LPCTSTR lpszFileName = NULL, //경로입력필드에 출력할 default값
                              //NULL이면 입력필드에 아무 값도 없는 상태
 DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,  //대화상자 속성
 LPCTSTR lpszFilter = NULL,   //확장자를기준으로 대화상자의 파일목록에 표시할 파일 필터링.
 CWnd* pParentWnd = NULL );   //새로 만들 파일 대화상자의 부모 윈도우의 주소.

2010년 3월 24일 수요일

What the hell is "Thread"

Thread

개요
 - Process:
   .4GB의 가상메모리를 할당 받음(필요한 부분만 memory에 올라가고, 나머지는 HD에 할당)
   .CreateProcess() API함수에 의해 생성됨.
   .하나 이상의 thread를 가짐.
 - Thread
   .Process의 단일한 실행 흐름을 의미함
    → thread는 process의 처리를 세분화한 개념으로 생각할수 있음.
    → process를 하나의 집, thread는 그 집의 거주자로 비유한 예.
    → 실행 파일을 실행하면 하나의 process가 생성되고, 내부적으로는 하나의 thread가 실행됨.
       이때 thread는 실제 실행단위임.
   .thread는 우선 순위를 가지며, 하나의 process에서 다수의 thread가 실행될 수 있음(multi-thread)
   .왜 thread가 필요한가?
    → 한 사람보다 두 사람이 동시에 일을 하면, 같은 시간동안 많은 일을 처리할 수 있음.
    → 혼자서는 절대 처리하지 못하는 일도 있음.
   .User Interface Thread와 Worker Thread로 구분됨.

 - Comment:
   .HW는 concurrency를 지원하지만 SW coding 상에서는 이를 구현하기가 어려움. SW는 sequential하게
    line by line으로 처리되므로.. thread는 이 HW의 concurrency를 흉내내기 위한, concurrency를 지
    시하기 위한(마치 HDL에서 처럼) 일종의 장치인 것 같다.
 
User Interface Thread / Worker Thread
 1.User Interface Thread
  - Application의 작업과는 독립적으로 작동하며 메세지 처리를 통해 event에 반응할 수 있는
    application을 만들때 사용
  ex) Windows 탐색기: 탐색기에서 file복사를 하는 중에도 임의의 폴더를 클릭시
      폴더의 내용을 화면에 보여줌.
      → 만일 이것이 thread로 구현되지 않았을 시, 복사중에 또 다른 action을 취할 수는 없는것임.
 
 2.Worker Thread
  - Background 작업을 위해 사용.

Functions
 - AfxBeginThread():
     MFC에서 thread를 생성하는 함수
     이 함수를 이용하면 특정 전역 함수를 별도의 thread로 실행할 수 있음.
     thread로 실행할 함수 내부에서 MFC class(CString, CWnd등)객체를 사용해야 하는 경우에 사용
 - CreateThread():
     thread로 실행할 함수 내부가 Win32 API로 채워지는 경우 유용함.
 - WaitForSingleObject():
     특정 객체(object)의 상태가 설정(set)될 때까지 현재 thread의 실행을 멈추는 역할을 함.
 - Sleep():
     인자로 주어진 시간만큼 무조건 흐름이 정지되는 함수
     위의 WaitForSingleObject()함수는 주어진 시간 이내에 특정 핸들(memory)의 상태가 설정(set)
     되기를 기다린다는 점이 Sleep()과의 차이점.
 - TerminateThread():
     thread를 강제 종료시키는 API함수.
     이때 thread를 관리하면서 사용했던 memory는 해제되지 못하고 낭비됨.
     특수한 경우로 용도를 제한하고 가급적 사용을 자제해야 함.

Example) Worker Thread 의 작성
 - Worker thread는 AfxBeginThread()함수를 이용하여 쉽게 만들 수 있음.
   ex) CWinThread* pThread = AfxBeginThread(ThreadFunc, &threadInfo);
      첫번째 인자: thread로 실행할 함수명 → ThreadFunc가 background작업으로 실행됨.
      두번째 인자: 함수에서 사용하게 될 인자.
 - 순서
  1) thread로 실행할 함수를 작성함.
     이때 thread로 실행할 함수는 반환형이 'UNIT', 인자는 'LPVOID' type이어야함
     ex) UINT threadTest(LPVOID pParam)
         {
          
          }
  2) AfxBeginThread()함수의 인자로 함수명을 전달
  3) Worker thread를 만들고 실행 할 수 있음.

TODO is..
 - 무한 loop를 실행하는(for(;;);) application을 작성하되,
   하나는 thread를 사용하는 loop를, 또 다른 하나는 thread없이 전역함수에서 loop가 실행되도록..
   두개의 차이점을 비교하여 볼 것..