원래 thread 함수 내부에서는 Updatedata를 사용할 수 없다.
하지만 Dlg클래스에 사용자 메시지를 등록하여
thread 함수에서 이에 접근하는 방법으로 사용가능하다.
1. 다음과 같이 Dialog class에 멤버함수로 UpdateData를 실행하는 함수를 만들어 준다.
LRESULT ___Dlg::OnUpdateDataFalse(WPARAM wParam, LPARAM lParam)
{
return UpdateData(FALSE);
}
LRESULT ___Dlg::OnUpdateDataTrue(WPARAM wParam, LPARAM lParam)
{
return UpdateData(TRUE);
}
2. stdafx.h 에 사용할 사용자 정의 메시지를 정의한다.
//사용자 정의 메시지
#define UM_UPDATEDATAFALSE (WM_USER+1) //thread 에서 updatedata를 사용하기 위한 사용자 message
#define UM_UPDATEDATATRUE (WM_USER+2)
3. ___Dlg.cpp 의
BEGIN_MESSAGE_MAP 에
정의한 사용자 메시지를 등록해 준다.
BEGIN_MESSAGE_MAP(.......(생략) )
.......(생략)
ON_MESSAGE(UM_UPDATEDATAFALSE, OnUpdateDataFalse) //thread 에서 updatedata 를 사용하기 위한 사용자메시지 처리
ON_MESSAGE(UM_UPDATEDATATRUE, OnUpdateDataTrue) //thread 에서 updatedata 를 사용하기 위한 사용자메시지 처리
END_MESSAGE_MAP()
4. thread를 시작할 때 현재 Dialog의 핸들을 인수로 넘겨주면서 시작한다.
(-> 작업자 thread 함수는 전역 함수이므로(dialog의 멤버 함수가 아님))
(-> Dialog class 의 멤버들을 사용할 수 있게 하기 위함.)
AfxBeginThread(thread작업함수이름,this);
5. thread작업함수 에서 dialog class 의 멤버들을 가져다 쓰기위한 pointer 를 선언/할당 한다.
UINT ThreadDataSave(LPVOID pParam)
{
___Dlg* pDlg = (___Dlg*)pParam;
...(생략)
}
6. thread 에서 dialog class의 메시지에 접근하여 updatedata 를 실행한다.
UINT ThreadDataSave(LPVOID pParam)
{
___Dlg* pDlg = (___Dlg*)pParam;
...(생략)
pDlg->PostMessage(UM_UPDATEDATAFALSE);
pDlg->PostMessage(UM_UPDATEDATATURE);
}
'[old 정리중] study > Visual studio' 카테고리의 다른 글
MFC Dialog, button 의 caption text 가져오기 (0) | 2012.09.12 |
---|---|
PreTranslateMessage() 가상 함수를 사용하여 Dialog 의 Enter , ESC 키 버그 해결 (0) | 2012.09.12 |
새로운 Class 파일생성 및 추가하기 (0) | 2012.09.12 |
visual assist X 단축키 (0) | 2012.09.11 |
UpdateData (0) | 2011.12.26 |