MFC에서 스레드 선언 및 사용 법

MFC Thread의 간단한 구현 및 사용 예제

 

스레드란?


스레드(Thread) : 하나의 프로그램 내에서 여러 개의 실행 흐름을 두기 위한 모델을 말합니다.

 

그러면 실제 MFC에서 스레드를 어떻게 구현하는지 알아보도록 하겠습니다.

아래의 예제는 MFC 대화상자 프로그램 하나를 생성하여 ThreadStart, ThreadPause, ThreadStop 세 개의 버튼을 생성하여 MFC 에서 어떻게 스레드를 선언하고 사용하는지 보여드리도록 하겠습니다.

1. 먼저 MFC 대화상자 기반의 프로젝트 하나를 선언하여 주십시오. 그리고 아래 그림과 같이 Button 세 개를 각각 배치하여 주십시오




 

그리고 나서 MainDlg.h 파일에 아래와 같이 변수를 선언하여 주십시오.


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

    //스레드 Working Type Enum으로 선언

    enum ThreadWorking

    {

        STOP = 0,

        RUNNING = 1,

        PAUSE = 2

    };

 

    //1. 변수 선언

    bool m_bThreadStart;

    CWinThread *m_pThread;

    ThreadWorking m_ThreadWorkType;

 

    //2. 스레드 동작시킬 함수를 생성

    static UINT ThreadFunctionFirstTest(LPVOID _mothod);

cs

 

이렇게 코드를 헤더파일에 작성을 완료하셨다면 다음은 MainDlg.cpp 에서 아래와 같은 함수를 선언하여 주십시오.

1

2

3

4

5

6

7

8

9

10

11

12

13

UINT CMFCThreadTestDlg::ThreadFunctionFirstTest(LPVOID _mothod)

{

    CMFCThreadTestDlg* pDlg = (CMFCThreadTestDlg*)AfxGetApp()->m_pMainWnd;

 

    int num = 0;

 

    while(m_ThreadWorkType == RUNNING)

    {

        AfxMessageBox(_T("ThreadRunning!!!"));

        Sleep(1000);

    }

    return 0;

}

Colored by Color Scripter

cs

 

그리고 앞에서 생성하였던 세 개의 버튼의 클릭 이벤트를 선언하여 아래와 같이 코드 작성을 시켜줍니다.

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

 

void CMFCThreadTestDlg::OnBnClickedButtonStart()

{

    // TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.

    if(m_pThread == NULL)

    {


        m_pThread = AfxBeginThread(ThreadFunctionFirstTest, this); 

 

        if(m_pThread == NULL)

        {

            AfxMessageBox(_T("Error!!!"));

        }

         //m_bAutoDelete를 선언해준것은 스레드 객체를 

         자동삭제 방지를 하겠다는 의미입니다.

         즉, 사용자가 직접 delete 하겠다는 것.

        m_pThread->m_bAutoDelete = FALSE; 


        m_ThreadWorkType = RUNNING;

    }

    else

    {

 

        if(m_ThreadWorkType == PAUSE)

        {

              //스레드 재 시작하겠다는 함수

            m_pThread->ResumeThread(); 

            m_ThreadWorkType = RUNNING;

        }

    }

}

 

 

void CMFCThreadTestDlg::OnBnClickedButtonPause()

{

    // TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.

    if(m_pThread == NULL)

    {

        AfxMessageBox(_T("Thread Not Start!!!!"));

    }

    else

    {

        m_pThread->SuspendThread(); //스레드 일시정지 함수

        m_ThreadWorkType = PAUSE;

    }

}

 

 

void CMFCThreadTestDlg::OnBnClickedButtonStop()

{

    // TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.

    if(m_pThread == NULL)

    {

        AfxMessageBox(_T("Thread Not Start!!!!"));

    }

    else

    {

        m_pThread->SuspendThread();

 

        DWORD dwResult;

        ::GetExitCodeThread(m_pThread->m_hThread, &dwResult);

 

        delete m_pThread;

        m_pThread = NULL;

 

        m_ThreadWorkType = STOP;

 

        AfxMessageBox(_T("Thread Stop!!"));

    }

}

 

Colored by Color Scripter

cs

 

이렇게 구현을 해주시고 프로젝트를 실행하여 테스트를 해보시면 스레드가 1초마다 작동 되는것을 메시지 박스로 확인 하실 수 있고, PAUSE 버튼을 클릭 시 스레드가 정지하고, STOP 버튼을 클릭시 해제가 되는 것을 확인 하실 수 있습니다.


이로써, MFC에서 스레드 선언 및 사용 방법에 대하여 알아보았습니다.


감사합니다.^^


728x90

이 글을 공유하기

댓글(5)

  • 2019.09.24 13:35

    비밀댓글입니다

    • 2019.09.24 20:31

      비밀댓글입니다

  • 초보
    2020.03.06 18:53

    OnInitDialog()도 참고해서 보여주셔야 될 것 같습니다.
    스레드함수에서 enum변수를 사용할 때 '비정적멤버참조는 특정 객체에 상대적이어야 한다' 는 오류가 나오는데 m_ThreadWorkType값이 참조하는 대상을 명확히 보여주는 코드가 본문에 없습니다.

  • 초보자2
    2021.06.13 19:15


    아래 코딩은 cpp 파일에서 정의되어야 합니다.
    enum ThreadWorking
    {
    STOP = 0,
    RUNNING = 1,
    PAUSE = 2
    };
    ThreadWorking m_ThreadWorkType;

    • 2021.06.13 19:22 신고

      알려주셔서 감사합니다ㅎㅎ
      제가 이때 MFC는 배우면서 혼자 공부하고 정리한 내용을 쓴거라 틀린 부분들이 많은데 알려 주셔서 감사합니다ㅎㅎ

Designed by JB FACTORY