본문 바로가기
Study/MFC

Debug Assertion Failed! File: f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\wincore.cpp Line: 906 (쓰레드에 UpdateData 호출시))

by 뿡뿡대마왕 2012. 1. 11.
반응형



Debug Assertion Failed! 
File: f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\wincore.cpp Line: 906

UpdateData(FALSE)를 호출시 위와 같은 에러가 발생한다면??

음..뭘까..왜 저런 에러가 나지..찾아가보니 발생한 곳은 UpdateData(FALSE)
왜 그럴까??
위치는 쓰레드에서 저 함수를 호출하고 있었던것..
구글링으로 찾아보니 많은 자료가 수루룩...
근데 해결 방법은 있는데 왜 그런지에 대한 명쾌한 답은 보이지 않는구만..ㅠㅠ 
쓰레드에서 UI직접 제어하면 안된다고 하는데 

// Note: if either of the above asserts fire and you are

  // writing a multithreaded application, it is likely that

  // you have passed a C++ object from one thread to another

  // and have used that object in a way that was not intended.

  // (only simple inline wrapper functions should be used)

  //

  // In general, CWnd objects should be passed by HWND from

  // one thread to another.  The receiving thread can wrap

  // the HWND with a CWnd object by using CWnd::FromHandle.

  //

  // It is dangerous to pass C++ objects from one thread to

  // another, unless the objects are designed to be used in

  // such a manner.



위와 같은 note가 있다.

쓰레드에서는 
GetDlgItem->SetWindowText("dd");
이런 방법으로 해주거나

아니면 아래처럼 해주면 된다.
출처: http://shinkai.tistory.com/4

#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으로 얻을 수 있으며,
아니라면 스레드의 파라메터로 넘겨받아 쓰면 되죠.


반응형

댓글