728x90
MFC Thread(쓰레드/스레드)에서 UpdateData() 함수 사용하기
이 포스트는 이전 블로그에서 이전된 포스트입니다.

 

쓰레드에서 직접 UpdateData() 함수를 수행하면 오류를 발생하고 불가능합니다.

아래와 같은 방법으로 우회하여 UpdateData() 함수의 기능을 사용할 수 있습니다.

 

먼저 헤더 파일에 아래와 같은 정의를 추가합니다.

1
#define CUSTOM_UPDATEDATA WM_USER
cs

 

또한 함수 정의를 추가합니다. (5행만 추가하면 됩니다.)

1
2
3
4
5
6
class CnStrCheckerDlg : public CDialogEx
{
//..나머지 소스 생략
public:
    afx_msg LRESULT ForCustomMessageFromThread(WPARAM  wParam, LPARAM lParam);
};
cs

 

이후 소스파일에서 아래와 같이 구현합니다.

1
2
3
4
5
6
7
8
9
BEGIN_MESSAGE_MAP(CTestDlg, CDialogEx)
    ON_MESSAGE(CUSTOM_UPDATEDATA, ForCustomMessageFromThread)
END_MESSAGE_MAP()
 
LRESULT CTestDlg::ForCustomMessageFromThread(WPARAM  wParam, LPARAM lParam)
{
    UpdateData(FALSE);
    return 0;
}
    cs

 

단, 보통 이미 BEGIN_MESSAGE_MAP(CTestDlg, CDialogEx) 구현되어 있습니다. 따라서 새로 추가하면 오류가 출력되니,

1~3번은 BEGIN_MESSAGE_MAP(CTestDlg, CDialogEx)로 찾아가서 2번만 추가해주세요.

아래처럼..

BEGIN_MESSAGE_MAP(CTestDlg, CDialogEx)

ON_WM_SYSCOMMAND()

ON_WM_PAINT()

ON_WM_QUERYDRAGICON()

ON_WM_CREATE()

ON_MESSAGE(CUSTOM_UPDATEDATA, ForCustomMessageFromThread)  // 이 줄만 추가. 나머지는 이미 있음.

END_MESSAGE_MAP()

 

이제 쓰레드 안에서 아래 5~6행처럼 사용하면 UpdateData() 기능을 사용할 수 있습니다.

 

1
2
3
4
5
6
7
8
9
UINT CTestDlg::ThreadFirst(LPVOID _mothod)
{
    CTestDlg *fir = (CTestDlg*)_mothod;
 
    CTestDlg* pDlg = (CTestDlg*)AfxGetApp()->m_pMainWnd;
    pDlg->PostMessage(CUSTOM_UPDATEDATA, 00);
 
    return 0;
}
cs

 

728x90

+ Recent posts