반응형
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으로 얻을 수 있으며,
아니라면 스레드의 파라메터로 넘겨받아 쓰면 되죠.
반응형
'Study > MFC' 카테고리의 다른 글
webbrowser2 에서 캐쉬 사용를 않하는 방법 (0) | 2012.03.22 |
---|---|
if (!_AfxCheckDialogTemplate(lpszTemplateName, FALSE)) 에서 죽을때! (0) | 2012.02.28 |
DDX 와 DDV (0) | 2011.12.27 |
[MFC] 팝업메뉴 달기 (버튼 밑에 팝업메뉴 생성하기) (0) | 2011.12.19 |
Debug Assertion Failed! ... File: f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\dlgdata.cpp Line: 269 (0) | 2011.12.05 |
댓글