Thread는 하나의 프로그램에서 그 프로그램과 상관없이 실행되는 루틴을 작성할 때 사용합니다. 예를 들어 통신 프로그램의 경우 계속해서 통신 포트를 체크하여 수신되는 데이터를 화면상에 표시하여야 하는데 만약 Thread를 사용하지 않으면 통신 데이터를 기다리는 동안 어떠한 작업도 수행할 수 없는 프로그램이 되는데 이 경우 통신 루틴을 Thread를 이용하여 실행하도록 구성합니다.
Thread Class 작성
Thread는 우선 CWinThread로부터 상속 받아 Thread Class를 작성해야 합니다.
먼저 Thread라는 이름으로 프로젝트를 생성합니다.
프로젝트 Tree에서 마우스 우측 버튼을 클릭하여 생성된 팝업 메뉴에서 Add의 부메뉴 Class를 선택하면 다음과 같은 대화 상자가 생성됩니다.
MFC Class를 선택하고 Add를 선택하면 다음과 같이 화면에 나타납니다.
Class name에 TestThread를 입력하고 Base class에 CWinThread를 선택한 후 Finish를 선택하면 Thread가 추가됩니다.
Class View를 선택하여 생성한 TestThread를 선택하고 Overrides 버튼을 선택하여 나타난 함수들 중 Run을 마우스로 더블클릭하여 Run 함수를 생성합니다.
TestThread.h를 열어 BOOL m_bRunningThread라는 변수를 설정한 후 Run함수를 다음과 같이 작성합니다.
int CTestThread::Run() { m_bRunningThread = TRUE; while(m_bRunningThread ){ //실행할 루틴 입력 Sleep(200); //필요에 따라 Sleep 시간을 조절해서 설정하면 된다. Sleep을 주지 않으면 부하가 너무 많이 걸린다. } return TRUE; } |
Thread를 사용할 경우 프로그램을 종료하기 전에 그 Thread를 멈추지 않으면 프로그램 자체가 종료되지 않습니다.
따라서 CTestThread에 End라는 함수를 다음과 같이 작성합니다.
void CTestThread::End() { m_bRunningThread = FALSE; } |
Thread Class 호출 및 종료
MainFrm.h에 CTestThread m_pTestThread를 선언합니다.
MainFrame의 OnCreate함수에서 다음과 같이 작성합니다.
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1) return -1; . . . //Thread 실행 m_pTestThread = (CTestThread*)AfxBeginThread(RUNTIME_CLASS(CTestThread), THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED); m_pTestThread->ResumeThread(); } |
MainFrame에 Class Wizard를 이용하여 OnClose함수를 만든 후에 다음과 같이 작성합니다.
void CMainFrame::OnClose() { //Thread를 종료합니다. m_pTestThread->End(); CMDIFrameWnd::OnClose(); } |
데모용 프로그램
데모용 프로그램은 앞에서 설명한 내용만을 작성하여 올려 두었습니다. Run함수 내에 아무것도 적지 않았으므로 실행하면 외형상 아무일도 하지 않습니다. Thread에 일정 기능을 수행하도록 한 프로그램이 Serial 통신 프로그램이므로 여기서는 위 내용을 익히고 Serial 통신 프로그램 제작을 보면 이해가 빠를 것입니다.
예제 프로그램 다운로드
'Visual C++(MFC)' 카테고리의 다른 글
MFC14. HTML 도움말 작성법 (0) | 2022.03.07 |
---|---|
MFC13. ADO (0) | 2022.03.07 |
MFC11. DLL 제작 (0) | 2022.03.07 |
MFC10. 메모리 (0) | 2022.03.07 |
MFC09. 인쇄하기 (0) | 2022.03.07 |