Использование try / catch в WindowProc MFC - PullRequest
1 голос
/ 18 июня 2009

Если я использую try / catch в переопределении WindowProc классов окна / представления MFC, это приводит к снижению производительности. Почему так и какая альтернатива?

Это я поймал в результате профилирования. Удаление блока заставляет функцию потреблять намного меньше времени. Я использую MS VS 2008.

Ответы [ 5 ]

2 голосов
/ 18 июня 2009

Простое использование try / catch не должно привести к снижению производительности - может быть, вы выбрасываете слишком много исключений? Профилировали ли вы свой код, чтобы узнать, откуда исходит снижение производительности?

1 голос
/ 22 июня 2009

Альтернатива заключается в размещении try-catch вокруг вашего собственного кода. Большинство вызовов вашего WndProc заканчиваются на DefaultWindowProc *, который не генерирует исключения C ++. Таким образом, перемещая пробную версию ближе к собственному коду, вы экономите много накладных расходов.

[*] DefaultWindowProc может выдавать исключения SEH, например, для увеличения стека, но вы не должны их обрабатывать.

1 голос
/ 18 июня 2009

В использование-try-catch-blocks-in-c Тодд Гарднер объясняет, что компиляторы используют подход «таблицы» или «кода» для реализации исключений. Подход «кода» объясняет снижение производительности.

0 голосов
/ 20 июня 2009

В своем классе приложения взгляните на переопределение CWinApp::ProcessWndProcException. Это дает вам шанс получить необработанное значение MFC CException s (и его производные) в любой команде или обработчике сообщений.

Если вам нужен последний шанс на ВСЕ, вам нужно взглянуть на установку собственного фильтра SEH.

0 голосов
/ 18 июня 2009

Я уверен, что вы знаете, что WindowProc обрабатывает много трафика. Любой код вне цикла (сообщение) будет выполняться каждым сообщением, проходящим через насос.

Я только что создал небольшое диалоговое приложение MFC, в котором я переопределяю WindowProc и просто считаю, сколько раз он вызывается. Тест показал, что простое перемещение курсора мыши над диалогом генерирует более 1000 вызовов WindowProc в секунду.

Просто о чем подумать.

p.s. Я бы добавил это в качестве комментария, но мне пока не хватает оценки репутации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...