문제

여러 다른 작업자 스레드를 생성하고 VS2003으로 컴파일되는 MFC 응용 프로그램이 있습니다.

ctreectrl :: getItemstate ()를 호출 할 때 때때로 디버그 어설 션 대화 상자 팝업을 받고 있습니다. 나는 이것이 유효하지 않은 항목을 핸들에 전달했기 때문이라고 가정하지만 이것은 내 즉각적인 관심사가 아닙니다.

내 우려는 내 로그에서 MFC 스레드가 Assert 대화 상자가 표시되는 동안 여러 Windows 메시지를 계속 서비스하는 것처럼 보입니다. 나는 Assert 대화 상자가 Modal이라고 생각했기 때문에 이것이 가능했는지 궁금했습니다.

도움이 되었습니까?

해결책

어설 션 실패를 보여주는 메시지 상자에는 자체 목적을위한 메시지 펌프가 있습니다. 그러나 메시지 상자에 대한 메시지뿐만 아니라 들어오는 모든 메시지를 발송합니다 (그렇지 않으면 물건이 차단 될 수 있음).

일반 모달 대화 상자의 경우 상위 창이 일반적으로 대화 상자 기간 동안 비활성화되기 때문에 문제가되지 않습니다.

어설 션 대화 상자를 시작하는 코드는 부모 창을 파악하지 못하므로 비활성화되지 않았습니다. 메인 창이 주장 당시 활성 창이 아닌 경우 발생할 수 있습니다. 다른 것들도 잘못 될 수 있습니다.

Visual Studio의 C 런타임 라이브러리가 어설 션 실패를보고하는 방식을 변경할 수 있습니다. _crtsetReportMode. 대화 상자를 표시하는 대신 디버거 및/또는 출력 창에 로그를 멈출 수 있습니다.

다른 팁

대화 상자 (MessageBox조차도)는 MODAL이라도 메시지 대기열을 펌핑해야합니다. 그렇지 않으면 그들은 당신이 "확인"버튼을 클릭했다는 것을 어떻게 알 수 있습니까?

어설 싱을 유발할 때 모든 것을 중지해야한다면 일반적으로 자신의 구현을 작성하는 것은 너무 어렵지 않습니다. assert() (또는 ASSERT() 또는 무엇이든) 디버거에 침입 할 것인지 묻는 메시지 상자를 표시하는 대신 디버거에 침입 할 것입니다 (디버거가 첨부 된 경우에만 해당).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top