Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Непонятное с MessageBox, Не видно окна 
V
    Опции темы
Sphinx
Дата 13.12.2011, 08:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 20.7.2006

Репутация: нет
Всего: нет



Уже который день бьюсь с MessageBox и все без толку.
Для ясности краткое описание программы:
Написана на API без классов. Создается окно. Через меню выбирается и открывается файл. Данные из файла загружаются в память и делается анализ данных. Если данные не соответствуют определенным критериям выдается MessageBox.

Все прекрасно работало, пока не попался файл с данными не соответствующими этим критериям. Так вот, если программа только что была запущена и в нее загружается этот злополучный файл, то программа вылетала с ошибкой. Стал разбираться в причинах и выяснил, что управление после вызова MessageBox передается черти-куда. Но самое интересное, если этот файл загружать в программу после того, как в нее был загружен файл с нормальными данными, то все работает правильно.

Стал пробовать вызывать MessageBox из разных частей программы - везде ведет себя одинаково. Если в программу еще не были загруженны данные, то MessageBox отрабатывает неполноценно - выводится звук, родительское окно блокируется, а самого окна не видно. Оно появляется только после нажатия клавиши Alt. Если же данные были загруженны, то все работает правильно.

Создается впечатление, что для этой функции надо сделать какието предварительные инициализации? Раньше пользовался ее без проблем (не часто).
PM MAIL   Вверх
GremlinProg
Дата 13.12.2011, 08:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106





--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Sphinx
Дата 13.12.2011, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 20.7.2006

Репутация: нет
Всего: нет



Спасибо.
Но в моем случае hInstance был проинициализирован. Еще раз проверил заполнение структуры WNDCLASSEX. Ничего криминального не нашел.
PM MAIL   Вверх
GremlinProg
Дата 13.12.2011, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



ну, суть то дела не меняет: http://forum.vingrad.ru/index.php?showtopi...t&p=2368969
можно конечно погадать на ромашке, но проблема однозначто в коде, а не в API


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Dem_max
Дата 13.12.2011, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 16
Всего: 39



А мне иногда нравиться чувствовать себя телепатом.


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
Sphinx
Дата 13.12.2011, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 20.7.2006

Репутация: нет
Всего: нет



Кажется нашел  smile 
Методом отсечения лишнего, выяснилось, что причина такого поведения кроется в обработке WM_PAINT.

У меня перед обработкой WM_PAINT проверялось, загружены ли данные. Если они не загружены, то и ничего не делалось, просто возвращал 0.
Оказывается надо обязательно делать BeginPaint() и EndPaint().

Но все равно не понятно, какая взаимосвязь между таким странным поведением MessageBox и WM_PAINT.
PM MAIL   Вверх
GremlinProg
Дата 13.12.2011, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(Sphinx @  13.12.2011,  14:45 Найти цитируемый пост)
Но все равно не понятно, какая взаимосвязь между таким странным поведением MessageBox и WM_PAINT.

ну, взаимосвязь все там же: http://forum.vingrad.ru/index.php?showtopi...t&p=2368194
когда процессор решает только задачи пользователя, у него не остается особо времени решать системные задачи, такие как, например: отрисовка диалога MessageBox smile 

если на WM_PAINT не подтвердить регион, требующий закраски, как "валидный" ( BeginPaint это делает), то это сообщение не будет удалено из очереди потока,
что приведет к постоянному "верчению" цикла обработки сообщений, а это прорва непотраченного пользовательского времени, которая без последствий не проходит


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Sphinx
Дата 13.12.2011, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 20.7.2006

Репутация: нет
Всего: нет



Я бы не сказал, что система при этом сильно загружалась.
Опять же не понятна роль в этом случае клавиши Alt, по нажатию которой все-таки окно прорисовывается.
Цитата(GremlinProg @  13.12.2011,  12:57 Найти цитируемый пост)
него не остается особо времени решать системные задачи, такие как, например: отрисовка диалога MessageBox  

У меня сложилось впечатление, что тут проблема не в недостатке ресурсов на отрисовку, а в том, что обработчик возвращал 0, т.е. он говорил системе, что все сделано и в дальнейшей обработке этот вызов не нуждается.
PM MAIL   Вверх
GremlinProg
Дата 13.12.2011, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(Sphinx @  13.12.2011,  15:25 Найти цитируемый пост)
Я бы не сказал, что система при этом сильно загружалась.

а не сильно - это как?
рискну предположить: процессор многоядерный (как минимум 2 ядра) и на 100% загружено только одно
Цитата(Sphinx @  13.12.2011,  15:25 Найти цитируемый пост)
У меня сложилось впечатление, что тут проблема не в недостатке ресурсов на отрисовку, а в том, что обработчик возвращал 0, т.е. он говорил системе, что все сделано и в дальнейшей обработке этот вызов не нуждается.

 smile 


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Sphinx
Дата 13.12.2011, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 20.7.2006

Репутация: нет
Всего: нет



Цитата(GremlinProg @  13.12.2011,  15:20 Найти цитируемый пост)
рискну предположить: процессор многоядерный (как минимум 2 ядра) и на 100% загружено только одно

 smile 
Всего лишь Athlon-1400 и ОС уже года 3, если не больше, не переустанавливалась. Так что загрузку процессора можно реально чувствовать.
А вот как нажатие на Alt все-таки позволяло прорисоваться окну - непонятно.

Но в любом случае спасибо за помощь в решении проблемы.
Сам долго бился, а как кому-то пожаловался, так и сразу же решение нашлось.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0600 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.