MFC) CWinThread 상속/시작/종료 정리
CWinThread
- MFC 기본 제공 클래스.
- 스레드 생성 시 이 클래스를 상속받아서 생성.
- 상속해서 구현해야 할 3가지 항목
virtual BOOL InitInstance();
virtual int ExitInstance();
virtual int Run();
- InitInstance()
CreateThread() 시 실행. 만약
1) pThread->CreateThread(CREATE_SUSPEND);
2) pThread->SuspendThread();
한다면 InitInstance()함수는 타지 않는다. 주의!!
- ExitInstance()
스레드 종료 시 실행. 호출 가능.
- Run()
InitInstance() 에서 return TRUE; 시 실행. TRUE를 리턴하지 않으면 실행되지 않으며, 내부에
스레드 동작 시 원하는 코드 삽입 가능. Run()함수가 돌아야 메시지 맵이 동작함. PostThreadMessage 로 메시지를 날렸는데 스레드에서 인식하지 못한다면 확인 해보길.
Run() 함수는 반드시 구현하지 않아도 된다. 스레드를 메시지루프 용도로만 사용할 시 따로 구현하지 않아도 됨.
[Header에 반드시 필요한 부분]
DECLARE_DYNCREATE(MyClass );
IMPLEMENT_DYNCREATE(MyClass , CWinThread)
메모리 동적 할당을 위함. 없으면 메모리부족 에러 발생.
[메시지 맵 사용 희망 시]
(header)
DECLARE_MESSAGE_MAP()
(soruce)
BEGIN_MESSAGE_MAP(MyClass, CWinThread)
//ON_THREAD_MESSAGE
END_MESSAGE_MAP()
[스레드 시작]
1. pThread = (MyClass *)AfxBeginThread(RUNTIME_CLASS(MyClass ));
pThread->PostThreadMessage(WM_MYTHREADMESSAGE, NULL, NULL)
2. pThread = new MyThread()
pThread->CreateThread(); or pThread->CreateThread(CREATE_SUSPEND);
[스레드 일시 중지]
pThread->SuspendThread();
[스레드 종료]
1. pThread->ExitInstance();
delete pThread;
2. ((MyThread*)pThread)->PostThreadMessage(WM_QUIT, 0 0);