| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > [QT4] подение при вызове exec() ! |
| Автор: Remiznik 6.6.2009, 15:48 | ||
| Странная ошибка трудно обьяснить словами в чем проблема но я попробую! Создаю простое диалоговое окно и при вызове его в приложение он блокирует работу приложение пока не будет какихто действий в этом диалогового окне ! вот примерный код
вот примерно такой код часто мной используемый и всегда нормально работающий ! Но на одной форме он падает при вызове exec(). Сразу скажу форма совершено обычная и работает нормально и падает только при вызове exec(). Самое странное во всем этом что иногда она срабатывает нормально а иногда падает и мне ни как не отследить от чего это происходит. Бывает 10 раз вызывается нормально а на 11 упадёт всё приложение . П.С немогу выложить полный код вызывающий форму и саму форму так как там много всего написано и сейчас с собой точной программы нет ! |
| Автор: SABROG 6.6.2009, 16:41 |
| Что говорит отладчик? |
| Автор: Remiznik 7.6.2009, 13:58 |
| Да я понимаю вопрос не странный какойто абстрактный, нет не четкого примера не результата ошибки. Так что я и не просил четкова ответа как с этим бороться ! Просто интересно было бы послушать мысли участников форума почему может падать приложение и почему имено функция exec() и почему имено эта функция приводит к падению ? Просто в документации по этой функции нечего особенного не написано, только то что она блокирует приложение и в результате работы возвращаете значение ! Кстате при падение она у меня не возвращаете никакого значения, и я незнаю в каком имено месте внутри неё происходит сбой ! |
| Автор: SABROG 7.6.2009, 14:01 | ||
А может она и не падает вовсе, а закрывается? Каким отладчиком пользовался? |
| Автор: Remiznik 7.6.2009, 14:07 |
| отладчиком не пользуюсь ! к сожеленью очень старый компьютер и ось совсем дубовая трудно на нём что дельное установить и работать тоже трудно .... можно сказать пишу в текстовом редакторе и потом компилирую ... только вот формы создаю в Disinger! падает точно пишит Segmentation fault . core dump ! |
| Автор: SABROG 7.6.2009, 14:10 |
| gdb консольный. |
| Автор: Remiznik 7.6.2009, 14:12 | ||
надо попробовать ! но всёравно узнать мнения что такого делает эта функция что приложение падает ))) |
| Автор: Любитель 7.6.2009, 19:31 |
| Функция не виновата Падает где-то твой диалог, вероятно кривая работа с памятью.. |
| Автор: SABROG 7.6.2009, 19:35 | ||||||
Кстати вместо этого
Лучше использовать это
Правда, если честно я не понимаю зачем создавать диалог в куче, а не в стеке. Да и родителя лучше передать:
|
| Автор: Remiznik 7.6.2009, 20:11 | ||
Любитель, я форму отдельно тестировал нармально работает а имено в главной программе падает ! SABROG, всё это пробовал нечего не меняеть так же падете . |
| Автор: SABROG 7.6.2009, 21:25 |
| Попробуй отладчик, потом напиши о результатах. |
| Автор: Любитель 7.6.2009, 22:53 | ||||
Ну.. что сказать - значит плохо тестировал. Ещё раз - код, написанный вначале, рабочий, хотя и несколько странный, ибо:
Кстати, насчёт родителя - при ручном удалении это как раз излишне. Как ты его "отдельно" тестировал? |
| Автор: SABROG 7.6.2009, 22:58 | ||
А я думаю наоборот не лишне перестраховаться, если забудешь сам удалить. В конкретно этой ситуации это никак не помогло бы, но лучше выработать привычку. |
| Автор: Remiznik 8.6.2009, 06:35 |
| Любитель, код который я привёл здесь это пример как я вызываю и где падает ! это не реальный код ...... реальный код до вызова этой функции содержит много настроек и загрузок ! тестировал просто написал маленькое окно в котором только кнопка для вызова моей формы ...... и тупо сидел тыкал на кнопку ждал когда упадёт ! не падало а в главном падает значит ошибка гдето в главной программе но как вызов exec() связан с главной программой ? |
| Автор: Любитель 8.6.2009, 09:16 | ||
Ладно.. В любом случае глупо гадать
Это уже философский вопрос.. Но, если свято следовать принципам RAII, то такой ситуации ("забудешь удалить") просто не может быть. |
| Автор: SABROG 8.6.2009, 10:49 |
Ну да, для этих целей есть QSharedPointer. |
| Автор: Remiznik 8.6.2009, 19:02 | ||
| Поделюсь своими соображениями ну от специалистов жду ответа такое возможно ) Для начла наверно всетаки придется поподробнее рассказать о том что хочу делать ! Есть главная программа и нужно открыть файл но не один их несколько в одном данный в другом описание ! Файл с даными очень большой .... и потому перед загрузкой файла выскакивает форма в которой указано диапазон файла (временной) к примеру от 0 до 20 сек это примерно файл весом 50 и больше метров ! так и все эти загрузки происходят в одной функции и вот я подумал если даных слишком много то стек может переполниться и упасть всё приложение ... но я не уверен это догадка ! Вопрос только почему падение происходит на функции exec() тоесть при отображение формы и блокировки !
это далеко не полный перечень всего что делается в одной функции так как после загрузки файла сразу нужно вывести дополнительные окна для работы . так что функции получилась очень большая и еше она загружает много даных в оперативку из файла !! так может она падать из-за того что очень большая ? |
| Автор: SABROG 8.6.2009, 21:50 | ||
Жесть какая. Чем qPrintable() не угодил? Да и вообще, если надо писать в stderr используй это:
Если просто в консоль то qDebug() или QTextStream(stdout). Хотя конечно никто не запрещает использовать стандартную библиотеку. А это я вообще не понял. P.S.: кстати, что сказал отладчик? |
| Автор: Remiznik 8.6.2009, 22:44 |
| это всё не суть важно меня подения волнуют больше ! с отладчиком не разабрался почемуто при входе в QFileDialog::getOpenFileName(this,"Open...", ".formular"); приложение виснит и а отладчик не даёт дальше крутить шаги ( |
| Автор: SABROG 8.6.2009, 23:29 |
Тогда предлагаю забыть о коде и сосредоточиться на отладке. Просто документацию не читал, причина то понятна. "крутить"? Куда? Какой отладчик используешь? Где backtrace, call stack? |
| Автор: Remiznik 8.6.2009, 23:40 |
| gdb 6 запускаю приложение просто под отладчиком всё нармально работает но при вызове QFileDialog::getOpenFileName виснит приложение и нечего не происходит не появляеться окно диалога !! да с документацией только сегодня начал знакомиться так что пока разбираюсь что кчему ) |
| Автор: Remiznik 17.6.2009, 11:20 | ||
покопался отладчиком вот что выдаёт стек вызывов !
у кого есть какие соображение ? |
| Автор: mes 17.6.2009, 11:36 |
догадка : невалидный this у кнопки покажите содержание MainWindow::paintEvent, конструктора этого класса, функцию в которой создаются контролы (если не в конструкторе) и список дата_членов. |
| Автор: SABROG 17.6.2009, 13:08 |
| Другая догадка - проблема в Qt с отрисовкой. Уже третий раз сталкиваюсь, похожий стек вызовов тут у человека и связан тоже с чекингом: http://www.forum.crossplatform.ru/index.php?showtopic=2931 |
| Автор: Любитель 17.6.2009, 13:49 |
Да не - тут же на своём обработчики пэинта падает: Там похоже проверка чека какой-т кнопки по невалидному указателю на эту кнопку. |
| Автор: Remiznik 17.6.2009, 15:09 |
| вот вы столько понаписали но я както не догоняю каким оброзом exec() связан с каким-то QAbstractButton::isChecked () но это ешо както понять можно на форме кнопки есть ! но вот эта страка для меня вобше загадка #1 0x0805177b in MainWindow::paintEvent (this=0xbffff430, e=0xbfffd570) at src/mainwindow.cpp:406 каким оброзом exec() связон с прорисовкой главного окна моего приложения ! И до этого проблем с функцией отрисовки небыло так что мне нечего не понятно ! |
| Автор: Любитель 17.6.2009, 15:17 |
| К тебе пришёл мессадж на перерисовку (MainWindow) - вызвалось событие перерисовки. Вполне нормально. Вопрос в том, почему оно свалилось |
| Автор: mes 17.6.2009, 15:48 |
Интересно, а что по Вашему делает метод exec() ? |
| Автор: Remiznik 17.6.2009, 23:40 |
| давайте по порядку )) во первых ! это какойто страный вызов MainWindow::paintEvent (this=0xbffff430, e=0xbfffd570) at src/mainwindow.cpp:406 так как в начале кажой функции у менять есть консольное сообшение о том что даная ыункция вызываеться и при подение на консоли нечего нет тоесть вызываеться какаято левая функция или както страно ! во вторых я смотрел стек при нармальной работе это всего не вызываеться даный стек который я привёл создаёться только при падении в третьих учитывая предыдцшее что я не могу отследить в каком месте имено падение так как я явно при нармально работе не вижу какая функция вызываеться как такое вобше может происходить ! mes, я думаю что метод exec() прорисовывает по верх всех окон окна которое его вызвало и блокирует работу всего остального приложения . Как это происходит я незнаю и как уже сказал в пунке 2 отследить что вызываеться какието стороние функции можно только при падении. И есле уж и вызываеться прорисовка главного окна то только после того как происходит событие закрытие диалогового окна вызвавшего exec() но ни как до этого .... ведь в этом нет смысла ! ну я так думаю ! обьясните если я не прав очень хочеться разобраться ! П.С ешо раз напоню что приложение падает не каждый раз при вызове exec() . Оно может упасть и с 1-го вызова так и 10-го. |
| Автор: SABROG 18.6.2009, 08:25 |
| Дану, чего гадать-то. Без полных исходников программы мы тебе уже ничем не поможем, как выясняется Qt вполне может падать из-за выхода за пределы массива и портить данные где-нибудь совсем в другом месте без AV. |
| Автор: mes 18.6.2009, 09:57 | ||||||||||||
поправка 1 : не прорисовывает, а показывает (т.е фактически устанавливает флаг окну о том, что окно теперь видимо и может быть отрисовано) прорисовка происходит в другом месте и в другое время (при обработке сообщения о прорисовке). поправка 2 : блокирует не работу всего приложения, а только юзерское взаимодействие (в зависимости от режима со всеми остальными окнами приложения, или только с родительским)
Происходит путем добавления своего цикла обработки сообщений, в котором все "нежелательные" сообщения игнорируются. Однако остальные (не юзерского взаимодействия) продолжают спокойно обрабатываться.
А если диалоговое окно переместили в сторону ? на старом месте остается пустота или остатки Вашего даилога ?! Перерисовка окон происходит при любом ресайзинге и перемещении диалогового окна, в том числе и при первом (когда оно толжко появилось). Точнее сказать не сама перерисовка, а вызов функции перерисовки, а она уж решает нужно ли рисовать какую то область или нет.
Если у Вас муссор в какой нибудь переменной, то именно так и будет.
Во первых неужто так трудно показать эту функцию ? если сомневаетесь она или нет, то нужна та которая лежит в файле mainwindow.cpp на 406 строчке. Во вторых, Вы свое сообщение наверняка отправляете в поток, и поэтому Вы не дождетесь его появления на консоли если прога упадет.
Может все таки выложите ту часть кода, о которой Вас просили Выше, или же она под строгим секретом ?! |
| Автор: Remiznik 18.6.2009, 10:32 |
| выложу просто под рукой счас нет ! но должен заметить что я закоментил всю функцию отрисовки тоесть вызов её остаёться но никаких действий не происходит и вроде падатьперестало но я не уверен так как я несколько раз проверел не упало но как уже говарил она может и не спервого а с n-го раза упасть такчто тестирую. но я так и не понял как вызываеться эты функция я не понял ! даже если она вызваеться почему на консоль не выводиться что она вызвана ? |
| Автор: Remiznik 22.6.2009, 10:30 |
| извеняюсь за поднятую панику ) видно глаз совсем замозолился ))) все работает нармально и стек был прав падение вызывалось функцией прорисовки я там не использовал неправельно переменую ! и на консоль всё выводтся нармально .... видимо так заработался что уже не замечал ! всем спасибо)) очень помогли ! |
| Автор: SABROG 22.6.2009, 10:56 |
А я у тебя еще 6 июня спросил, что отладчик говорит. Если бы прислушался, то смог в тот же день свою проблему решить. |
| Автор: Remiznik 22.6.2009, 11:39 |
| я послушал ))) просто не сразу разобрался что к чему .... и меня смушало что на консоль не выводилось сообшение на что функция вызвана .... оказалось что я вывод на консоль поставил в конце функции и потому до этого места она не доходила ))).... а я это не заметил ) |