![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| Sphinx |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 74 Регистрация: 20.7.2006 Репутация: нет Всего: нет |
Уже который день бьюсь с MessageBox и все без толку.
Для ясности краткое описание программы: Написана на API без классов. Создается окно. Через меню выбирается и открывается файл. Данные из файла загружаются в память и делается анализ данных. Если данные не соответствуют определенным критериям выдается MessageBox. Все прекрасно работало, пока не попался файл с данными не соответствующими этим критериям. Так вот, если программа только что была запущена и в нее загружается этот злополучный файл, то программа вылетала с ошибкой. Стал разбираться в причинах и выяснил, что управление после вызова MessageBox передается черти-куда. Но самое интересное, если этот файл загружать в программу после того, как в нее был загружен файл с нормальными данными, то все работает правильно. Стал пробовать вызывать MessageBox из разных частей программы - везде ведет себя одинаково. Если в программу еще не были загруженны данные, то MessageBox отрабатывает неполноценно - выводится звук, родительское окно блокируется, а самого окна не видно. Оно появляется только после нажатия клавиши Alt. Если же данные были загруженны, то все работает правильно. Создается впечатление, что для этой функции надо сделать какието предварительные инициализации? Раньше пользовался ее без проблем (не часто). |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
-------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| Sphinx |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 74 Регистрация: 20.7.2006 Репутация: нет Всего: нет |
Спасибо.
Но в моем случае hInstance был проинициализирован. Еще раз проверил заполнение структуры WNDCLASSEX. Ничего криминального не нашел. |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
ну, суть то дела не меняет: http://forum.vingrad.ru/index.php?showtopi...t&p=2368969
можно конечно погадать на ромашке, но проблема однозначто в коде, а не в API -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 16 Всего: 39 |
А мне иногда нравиться чувствовать себя телепатом.
-------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
| Sphinx |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 74 Регистрация: 20.7.2006 Репутация: нет Всего: нет |
Кажется нашел
Методом отсечения лишнего, выяснилось, что причина такого поведения кроется в обработке WM_PAINT. У меня перед обработкой WM_PAINT проверялось, загружены ли данные. Если они не загружены, то и ничего не делалось, просто возвращал 0. Оказывается надо обязательно делать BeginPaint() и EndPaint(). Но все равно не понятно, какая взаимосвязь между таким странным поведением MessageBox и WM_PAINT. |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
ну, взаимосвязь все там же: http://forum.vingrad.ru/index.php?showtopi...t&p=2368194 когда процессор решает только задачи пользователя, у него не остается особо времени решать системные задачи, такие как, например: отрисовка диалога MessageBox если на WM_PAINT не подтвердить регион, требующий закраски, как "валидный" ( BeginPaint это делает), то это сообщение не будет удалено из очереди потока, что приведет к постоянному "верчению" цикла обработки сообщений, а это прорва непотраченного пользовательского времени, которая без последствий не проходит -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| Sphinx |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 74 Регистрация: 20.7.2006 Репутация: нет Всего: нет |
Я бы не сказал, что система при этом сильно загружалась.
Опять же не понятна роль в этом случае клавиши Alt, по нажатию которой все-таки окно прорисовывается.
У меня сложилось впечатление, что тут проблема не в недостатке ресурсов на отрисовку, а в том, что обработчик возвращал 0, т.е. он говорил системе, что все сделано и в дальнейшей обработке этот вызов не нуждается. |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
а не сильно - это как? рискну предположить: процессор многоядерный (как минимум 2 ядра) и на 100% загружено только одно -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| Sphinx |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 74 Регистрация: 20.7.2006 Репутация: нет Всего: нет |
Всего лишь Athlon-1400 и ОС уже года 3, если не больше, не переустанавливалась. Так что загрузку процессора можно реально чувствовать. А вот как нажатие на Alt все-таки позволяло прорисоваться окну - непонятно. Но в любом случае спасибо за помощь в решении проблемы. Сам долго бился, а как кому-то пожаловался, так и сразу же решение нашлось. |
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |