2009-09-21 4 views
1

여러 가지 다른 작업자 스레드를 생성하고 VS2003으로 컴파일되는 MFC 응용 프로그램이 있습니다. 어설 션 대화 상자가 표시되는 동안 Windows 메시지가 서비스됩니까?

는 CTreeCtrl의 :: GetItemState를() 나는 가끔 디버그 주장 대화 팝업을 얻고 호출 할 때. 내가 잘못된 항목에 대한 핸들을 전달했기 때문에 이것이 내 가정 일 뿐이라고 생각합니다.

내 관심은 : MFC 스레드가 어설 션 대화 상자가 표시되는 동안 창 메시지의 수를 서비스를 계속 것처럼 내 로그에서, 그것은 보인다. 나는 어설트 대화가 모달이라고 생각하여 이것이 가능할 지 궁금해하고 있 었는가?

+0

스레드 메시지를 처리하는 다른 스레드가 보이지 않습니까? –

+0

내 로그에 스레드 ID가 포함되어 있고 On *** 메시지를 처리하고 GetItemState()를 호출하는 동일한 스레드 인 것 같습니다. –

답변

2

어설 션 오류를 나타내는 메시지 상자에는 자체 용도의 메시지 펌프가 있습니다. 그러나 메시지 상자의 메시지뿐만 아니라 들어오는 모든 메시지를 발송합니다 (그렇지 않으면 사안이 차단 될 수 있음).

정상적인 모달 대화 상자에서는 대개 대화 상자가 실행되는 동안 부모 창을 사용할 수 없으므로 문제가되지 않습니다.

해야했습니다 부모 창을 파악하는 데 실패 주장 대화를 시작하고, 따라서이 비활성화 된 코드입니다. 주 윈도우가 어서션 당시 활성 윈도우가 아닌 경우 이런 일이 발생할 수 있습니다. 다른 것들도 잘못 될 수 있습니다.

당신은 _CrtSetReportMode와 방법 비주얼 스튜디오의 C 런타임 라이브러리 보고서의 주장 실패를 변경할 수 있습니다. 대화 상자를 표시하는 대신 디버거에서 중지하고 출력 창에 로그 할 수 있습니다.

+0

설명을 주셔서 감사합니다. _CrtSetReportMode를 사용하여 대화 상자를 표시하는 것보다 더 나은 작업을 수행 할 수있는 아이디어가 마음에 들지만 불행히도 Visual Studio가 설치되지 않은 독립 PC에서 실행됩니다. –

+0

어설 션을 사용하도록 설정 했으므로 개발 시스템에 있다고 가정했습니다. –

2

대화 상자 (메시지 상자조차도)는 모달 인 경우에도 메시지 대기열을 펌프해야합니다. 그렇지 않은 경우 어떻게 "OK"버튼을 클릭했는지 알 수 있습니까?

당신은 어설는 당신이 헤어지고 싶어 묻는 메시지 박스를 표시하는 대신 디버거에 침입합니다 assert() (또는 ASSERT() 또는 무엇이든)의 자신의 구현을 작성하는 것이 너무 어렵지 않다 트리거 할 때 모든 것을 중지해야하는 경우 (아마도 디버거가 연결되었다고 판단한 경우에만 해당).