Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > Виснет приложение при вызове сторонней функции. |
Автор: kinetik 27.6.2011, 16:10 |
Приветствую всех! Есть оконное приложение на Qt (пользуюсь Qt Creator), прям в main вызывается функция из сторонней библиотеки и приложение как бы виснет на этой строке. к примеру: printf("before"); apiCalls(); // если точку останова поставить сдесь и посмотреть что будет то отладчик как-будто висит на месте и ничего не делает... и такое ощущение что происходит какая-то тупая блокировка потоков printf("after"); // и вот after не печатается Весь смысл в том что все делается в одном потоке, я никакие потоки не пораждаю. Но дальше интереснее если я делаю новый проект чисто консольный то все работает, все сторонние библиотеки одинаковые.. |
Автор: loneybibi 27.6.2011, 21:54 |
а ты уверен что приложение находит библиотеку ? лучше код покажи .. или готовый проект ? |
Автор: kinetik 27.6.2011, 22:14 | ||
Уверен т.к. точно также подключаю в консольный проект все работает. Тут мне интересует вопрос потоков, может там гуй мешает выполнится действию? Просто как-то странно, когда консольный проект работает, а оконное приложение нет. А исходники я привел почти что, т.к. реально сейчас все упростил, но все равно фейл. Исходники библиотеки нет, есть дллка и файлик который цепляется к дллке и через него все функции вызываются. |
Автор: loneybibi 27.6.2011, 22:20 |
не ну как бы если я не ошибаюсь то функции printf() это только для QCoreApplication и они естествнно не будут работать в GUI приложении .. если только это не "QtCoreApplication\QtGui" приложение , т.е. и консоль и GUI интерфейс .... я просто не пойму что не так и что по чем .. покажи код .. положи архив с проектом попробую помочь пока не заснул ... ![]() |
Автор: kinetik 27.6.2011, 22:43 | ||||
да дело не в этом ![]()
И вот на apiCalls() все виснет, точнее дальше не идет, но гуй отзывчивый, я так понимаю что если я работаю в контексте одного потока, то гуй должен висеть при исполнении apiCalls(), а он почти сразу оживает. |
Автор: loneybibi 27.6.2011, 23:00 | ||
если GUI отзывчивый то значит функция либо уже закончила свою работу и больше ничего не делает (или не может выполнить себя в крайнем случае ), или функция (как ты ее там делаешь я не знаю) выполняется в другом потоке параллельном и в таком случае естественно GUI будет полностью (отзывчив) функционировать как отдельный поток! что вызывает функция apiCalls !? , если не секрет что она вообще делает и ее код ? просто так очень трудно будет тебе помочь .. вообщем извини если что но я не телепат ... это равно-сильно тому что я тебе напишу:
и пойми почему моя программа не выполняет функцию myFunction() ? |
Автор: kinetik 30.6.2011, 00:29 | ||||
Я не прошу разобраться в моем коде, я обозначил проблему и только хочу услышать мнения в какую сторону копать. Все объяснено в первом посте и достаточно полно. То что ты написал смешно и ты не понял даже сути проблемы ![]() |
Автор: loneybibi 30.6.2011, 01:24 | ||||||||
Да все я понял. Просто ты так описываешь проблему что грубо говоря тут может быть что угодно! Попробуй при использовании GUI приложения Debug функции Qt:
Скорее всего что apiCalls работает в другом потоке если GUI остается отзывчив. Но при этом не переходит к выполнению следующей инструкции. Т.е. если к примеру QLoopEvent (цикл) запустить вместо apiCalls(), и поставить к примеру псевдо много-поточность qApp->processEvents() то до завершения цикла (QLoopEvent::quit()) программа к метке Debug 2 не дойдет но GUI будет доступен. Это я к тому что если даже взять пример с отображением процесса загрузки файла к примеру, если по правильному, то GUI работает в одном потоке а файл грузится в другом, вот так же и тут. Просто не понятно как ты вызываешь стороннюю функцию и как она работает, может она сама по себе обрабатывается отдельным потоком, при этом GUI остается доступным но до завершения выполнения функции дальше перейти к инструкции не может. Надеюсь смысл того что я хотел сказать понятен. Я конечно извиняюсь мне иногда трудно выразить мысль, потому как я любитель а не профессионал. ![]() |