티스토리 뷰
MFC UI 쓰레드
아래 4단계로 만든다.
1, 쓰레드 구현할 UI쓰레드 클래스를 CWinThread로 부터 상속받아 추가 (그림1)
2. 쓰레드 안에서 만들 윈도우 클래스를 CWnd(CFrameWnd)를 상속받아 추가하고 메시지를 처리한다. (그림2)
3. 1번에서 만든 UI쓰레드 클래스에 InitInstance()를 재정의하고 2번에서 정의한 윈도우 클래스를 이용하여 윈도우를 생성한다. (코드 13~24행)
DECLARE_DYNCREATE(CUIThread) 와 IMPLEMENT_DYNCREATE(CUIThread, CWinThread) 선언도 필요함 (그림3, 4)
4. AfxBeginThread() 호출하여 스레드 시작, 이때 1번에서 생성한 UI쓰레드 클래스의 CRuntimeClass를 AfxBeginThread() 인자로 넘긴다. (코드 29행)
그림1>
1. 위 그림처럼 쓰레드 구현할 클래스이므로 CWinThread를 상속받은 UIThread 클래스 생성한다.
그림2>
2. 위 그림처럼 CWnd(CFrameWnd)를 상속받는 CUIFrameWnd 클래스를 생성한다.
3. 위 코드처럼 DECLARE_DYNCREATE() 와 IMPLEMENT_DYNCREATE() 추가하고 (9, 13행),1번에서 만든 UIThread 클래스에서 InitInstance()를 재정의하고 2번에서 만든 CUIFrameWnd 윈도우를 만든다. (14~23행)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 |
// CUIThread.h
class CUIThread :
public CWinThread
{
public:
CUIThread();
~CUIThread();
virtual BOOL InitInstance(); // 재정의 필요
DECLARE_DYNCREATE(CUIThread) // 선언 없으면 메모리 부족 에러 뜸
}
// CUIThread.cpp
IMPLEMENT_DYNCREATE(CUIThread, CWinThread) // 선언 없으면 메모리 부족 에러 뜸
BOOL CUIThread::InitInstance()
{
// TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다.
CUIFrameWnd* pFrame = (CUIFrameWnd*)RUNTIME_CLASS(CUIFrameWnd)->CreateObject();
pFrame->Create(NULL, L"UI Frame"); // 쓰레드 창을 만든다
pFrame->ShowWindow(SW_SHOW);
pFrame->UpdateWindow();
m_pMainWnd= pFrame;
// return CWinThread::InitInstance(); // CUIFrameWnd 창이 사라짐
return TRUE;
} |
cs |
4. 아래 코드처럼 View에서 마우스 우측 버튼 클릭할때 AfxBeginThread() 호출할때 1번에서 만든 클래스를 인수로 전달하면 된다.
1
2
3
4
5 |
void CThreadView::OnRButtonDown(UINT nFlags, CPoint point)
{
AfxBeginThread(RUNTIME_CLASS(CUIThread));
CView::OnRButtonDown(nFlags, point);
} |
cs |
실행결과>
참고>
3번에서 DECLARE_DYNCREATE(CUIThread) 와 IMPLEMENT_DYNCREATE(CUIThread, CWinThread) 선언 없으면 그림3과 같이 메모리 부족 창을 보이면서 그림4 처럼 예외가 발생한다.
3번 코드 22행이 자동 생성된 코드인데 부모 클래스인 CWinThread 의 InitInstance() 호출하면 UI창이 사라지므로 23행 처럼 return TRUE 로 한다.
그림3>
그림4>