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가 모든 스레드 환경에서 완전하게 작동하진 않습니다
.
스레드로 뭔가를 할 때는 꼭 염두에 두셔야 해요.. -_-;

 

Posted by 두장