원래 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);
}
'프로그래밍 > C/C++' 카테고리의 다른 글
[펌] bat파일 명령어 (1) | 2018.03.06 |
---|---|
[펌][MFC] 프로그램을 하나만 실행하기 (0) | 2013.08.13 |
[펌]LINK : fatal error LNK1104: 'LIBC.lib' 파일을 열 수 없습니다. (0) | 2013.05.30 |
[펌]AfxMessageBox의 타이틀 변경 (0) | 2013.03.27 |
[펌]Visual Studio 테마 변경하기 (0) | 2013.03.20 |