Thread 사용시 UpdateData(false); 는 실행 중에 Debug Assertion Failed라는
에러는 발생시킨다.
예를 들면,
MyThread( CMyDlg *p )
{
p->UpdateData(BOOL);
}
위와 같은 방법은 않된다.
가능한 방법1.
GetDlgItem()->SetWindowText(CString); 방법을 사용해서 특정 아이템만
업데이트를 하는 것이다. 이때, SetWindowText()의 인자 값으로는 CString만 온다는 것에 주의.
예제.
int cnt = 100;
CString num;
num.Format("%d",cnt);
Pointers->GetDlgItem(IDC_STATIC_RESULT)->SetWindowText(num);
그러나 콘트롤 하나 하나 직접 처리하는게 번거로워
꼭 UpdateData()로 일괄처리하고 싶으시다면..
유저메시지를 하나 만들어서 윈도로 쏘세요.. PostMessage( UM_UPDATE) 따위로..
그래서 그 윈도가 스스로 UpdateData를 실행하도록 하셔야 합니다.
예를 들면..
#define UM_UPDATE WM_USER
BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
ON_MESSAGE( UM_UPDATE, OnUpdateData)
END_MESSAGE_MAP()
LRESULT CMyDlg::OnUpdateData( WPARAM wParam, LPARAM lParam)
{
UpdateData( FALSE);
return 0;
}
위와 같이 해 놓고.. 필요할때..스레드 상에서 다음과 같이 호출하면 되겠지요.
pDlg->PostMessage( UM_UPDATE);
pDlg 는 CMyDlg의 포인터입니다. CMyDlg가 매인 윈도우라면
AfxGetApp()->m_pMainWnd으로 얻을 수 있으며,
아니라면 스레드의 파라메터로 넘겨받아 쓰면 되죠.
참고로 MFC가 모든 스레드 환경에서 완전하게 작동하진 않습니다.
스레드로 뭔가를 할 때는 꼭 염두에 두셔야 해요.. -_-;