728x90

 

MFC Thread(쓰레드/스레드)의 간단한 구현 및 사용 예제 / 쓰레드에서 본래 윈도우 멤버변수 사용하기

 

이 포스트는 이전 블로그에서 이전된 포스트입니다.

 

먼저 mfc에서 thread 생성 시에는 AfxBeginThread 함수를 이용합니다.

이에 대한 자세한 설명은 MSDN에 넘기겠습니다.

https://msdn.microsoft.com/ko-kr/library/s3w9x78e.aspx

 

 

만약 MFC에서 무한 루프로 동작할 일이 있다면(즉, 백그라운드에서 계속 작업할 일이 있다면)

간단하게 while(1) 같은 걸로 돌릴려 할텐데 이 경우 MFC는 그냥 사용하면 메시지 핸들에서 처리하지 못하고 응답없음이나 기타 오류로 다운되 버리죠..

 

이럴경우 WM_CREATE, 즉 윈도우 생성될때 쓰레드를 같이 하나 생성해버리고, 쓰레드에서 무한 루프를 돌려버리면 됩니다.

 

1. 먼저 쓰레드에 사용될 함수부터 만듭니다. AfxBeginThread에 사용됨

​다이어로그 헤더파일로 가서 아래 함수를 선언합니다.​ (TestDlg.h) 

6행만 입력하시면 됩니다.

static UINT ThreadFirst(LPVOID _mothod);

이 경우 해당 함수가 꼭 static 선언이 되어야 합니다.

 

// CTestDlg 대화 상자
class CTestDlg : public CDialogEx
{
// ..다른코드 생략
public:
    static UINT ThreadFirst(LPVOID _mothod);                    
};

 

이후 함수안에서 행해질 동작을 구현합니다. 이는 소스파일에서 수행하면 됩니다. (TestDlg.cpp)

 

UINT CTestDlg::ThreadFirst(LPVOID _mothod)
{
    CTestDlg *fir = (CTestDlg*)_mothod;

    while (1)
    {
        // ..이 곳에 루프 시 수행할 동작을 선언하세요.
        Sleep(1000);
    }
    return 0;
}

 

2. 이후 Thread를 생성합니다.

이는 뭐.. 버튼에 넣어 줘도 되고, 윈도우 실행시부터 실행하려면 WM_CREATE, 즉 OnCreate 함수에 넣어줍니다.

7~14행을 추가합니다.

 

int CTestDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (CDialogEx::OnCreate(lpCreateStruct) == -1)
        return -1;

    // TODO:  여기에 특수화된 작성 코드를 추가합니다.
    CWinThread *p1 = NULL;
    p1 = AfxBeginThread(ThreadFirst, this);

    if (p1 == NULL)
    {
        AfxMessageBox(L"Error");
    }
    CloseHandle(p1);

    return 0;
}

 

이렇게 하면 정상적으로 프로그램이 실행되고, 백그라운드로(실제론 다른 쓰레드로) 무한 루프 작업도 돌릴수 있습니다.

 

반응형

 

아, 추가적으로 static 함수인 쓰레드 함수 안에서 본래의 다이어로그의 변수는 사용이 불가능하기 때문에 아래와 같이 사용하시면 됩니다.

7~8행만 참고하시면 됩니다.

 

UINT CTestDlg::ThreadFirst(LPVOID _mothod)
{
    CTestDlg *fir = (CTestDlg*)_mothod;

    //아래 두 줄을 참고합니다.
    //m_NumOutput은 본래 DIALOG에 선언된 int 변수라 가정
    CTestDlg* pDlg = (CTestDlg*)AfxGetApp()->m_pMainWnd;
    pDlg->mNumOutput = 100;

    return 0;
}

 

 

사용후 제거를 사용안했는데 

이는 아래 링크를 들어가서 참고하시면 될 것 같습니다.

http://injunech.tistory.com/38

 

728x90

+ Recent posts