2010-07-26 4 views
1

오래된 제품을 유지하면서 나는 'C++ Exception'을 말하는 수백 개의 메시지 상자로 채워지는 화면 오류를 발견했다. 내가 메시지 큐에있는 모든 메시지를 처리하는이 라인의 목적을 이해하지만 오류 원인을 모르겠어요ProcessMessages가 C++ 예외를 throw하는 이유는 무엇입니까?

Application->ProcessMessages(); 

: 나는 다음 줄에 문제를 추적.

특정 솔루션을 찾고있는 게 아니지만 다른 사람이이 문제를 겪고 있거나 어떤 상황에서 이러한 일이 발생할 수 있는지 궁금해집니다.

모든 메시지 상자를 닫으면 응용 프로그램이 정상적인 예상 동작으로 돌아갑니다.

업데이트 - 더 많은 검색을 한 후에 오류가 반드시 ProcessMessages의 오류가 아니라는 것을 알았습니다. 프로그램이 집중적 인 계산을하고 실제로 메모리가 부족하기 때문에 오류가 발생합니다. ProcessMessages를 주석 처리하는 것은 오류없이 계산을 수행 할 수있을 정도로 메모리 소비를 줄이는 것 같습니다. 따라서 ProcessMessages는 범인과 비슷하지만 실제로는 그렇지 않습니다.

내가 할 리팩터링이있는 것 같습니다.

업데이트 2 - 3 일 후, 나는 ProcessMessages가 호출 될 때만 오류가 발생한다는 결론에 도달했습니다. ProcessMessages에 대한 모든 호출에 대해 의견을 말하면 많은 경우 응용 프로그램이 상수의 메모리 사용량으로 정상적으로 실행되므로 집중적 인 계산이 메모리를 빨아 들이지 않는다는 것을 의미합니다. 호출의 주석 처리를 제거하면 메모리가 오류 지점으로 다시 급증합니다. 그래서 원래 질문은 의미합니다 : ProcessMessages가이 오류를 일으키는 이유는 무엇입니까?

일부 호출은 타이머 이벤트에서 만들어지고 다른 호출은 기본 응용 프로그램 실행에서 만들어지는 것으로 보입니다. 이것이 문제가 될 수 있습니까?

+0

어떤 라이브러리를 사용하고 있습니까? –

+0

사용중인 라이브러리가 확실하지 않습니다. Borland C++ Builder는 질문에 대해 알려주는 역할을 담당합니다. ProcessMessages는 C++ Builder Windows 응용 프로그램을위한 TApplication 클래스의 메서드입니다. – Everett

+0

'std :: runtime_error' 잡으려고 시도하십시오 - 예외가 그 클래스를 기반으로한다면'e.what()'에서 더 많은 정보를 얻을 수 있습니다. – AndiDog

답변

0

이것은 대부분 추측이지만 내가 보는 바에 따르면 메시지의 큰 백 로그로 인해 발생하는 문제입니다. 대규모 계산 중에 응용 프로그램은 많은 수의 메시지가 대기열에 던져지는 동안 초 단위로 응답하지 않게됩니다.이 중 많은 수가 타이머 이벤트입니다. 계산이 끝나고 ProcessMessages가 호출되면 응용 프로그램이 너무 많은 메시지로 인해 압도되어 모두 처리되면 메모리 오버플로가 발생합니다.이벤트를 발송할 때 계산을 몇 번 반복 할 때마다 ProcessMessages를 추가하면 메모리 소비가 일정하게 유지됩니다.

소리가 들리겠습니까?

2

응답으로 Win32 :: MessageBox() API를 사용하는 일반 메시지를 보여주는 catch-all 예외 처리기로 라이브러리의 메시지 처리 코드에서 응용 프로그램 오류가 발생하는 것 같습니다. 코드에서 "C++ Exception"문자열을 찾아 catch(...), catch (std::exception&) 또는 유사한 처리기에 있는지 확인하십시오. 대신 Win32 unhandled exception filter을 사용하고있을 가능성이 있습니다.

디버그 -> 예외 대화 상자를 사용하여 Visual Studio 디버거에서 프로그램을 실행하여 처리되지 않은 경우가 아니라 던져 질 때 C++ 예외를 catch하도록 설정하는 것이 가장 바람직합니다. 그렇게하면 즉시 예외를 생성하는 사이트를 찾을 수 있습니다.

디버거에서 실행할 수없는 경우 오류를 생성하는 방법을 적어도 찾을 수 있도록 __LINE____FILE__ C 매크로를 사용하여 처리되지 않은 예외 처리기를 사용자 지정해야 할 수 있습니다. 메시지 상자 표시에서 Win32의 OutputDebugString() API로 전환하고 DebugView과 같은 도구를 사용하여 디버깅 문자열을보십시오.

관련 문제