Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, 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,  21:54)
а ты уверен что приложение находит библиотеку ? лучше код покажи .. или готовый проект ?

Уверен т.к. точно также подключаю в консольный проект все работает.
Тут мне интересует вопрос потоков, может там гуй мешает выполнится действию? Просто как-то странно, когда консольный проект работает, а оконное приложение нет.
А исходники я привел почти что, т.к. реально сейчас все упростил, но все равно фейл. Исходники библиотеки нет, есть дллка и файлик который цепляется к дллке и через него все функции вызываются.

Автор: loneybibi 27.6.2011, 22:20
не ну как бы если я не ошибаюсь то функции printf() это только для QCoreApplication и они естествнно не будут работать в GUI приложении .. если только это не "QtCoreApplication\QtGui" приложение , т.е. и консоль и GUI интерфейс .... я просто не пойму что не так и что по чем .. покажи код .. 

положи архив с проектом попробую помочь пока не заснул ... smile

Автор: kinetik 27.6.2011, 22:43
Цитата(loneybibi @ 27.6.2011,  22:20)
не ну как бы если я не ошибаюсь то функции printf() это только для QCoreApplication и они естествнно не будут работать в GUI приложении .. если только это не "QtCoreApplication\QtGui" приложение , т.е. и консоль и GUI интерфейс .... я просто не пойму что не так и что по чем .. покажи код .. 

положи архив с проектом попробую помочь пока не заснул ... smile

да дело не в этом smile принт я привел для примера просто чтобы ты видел что-что-то происходит...

Код

void MainWindow::get_data_clicked()
{
    ui->textEdit->setPlainText("Start");
    apiCalls();
    ui->textEdit->setPlainText("End");
}


И вот на apiCalls() все виснет, точнее дальше не идет, но гуй отзывчивый, я так понимаю что если я работаю в контексте одного потока, то гуй должен висеть при исполнении apiCalls(), а он почти сразу оживает. 

Автор: loneybibi 27.6.2011, 23:00
если GUI отзывчивый то значит функция либо уже закончила свою работу и больше ничего не делает (или не может выполнить себя в крайнем случае ), или функция (как  ты ее там делаешь я не знаю) выполняется в другом потоке параллельном и в таком случае естественно GUI будет полностью (отзывчив) функционировать как отдельный поток! что вызывает функция apiCalls !? , если не секрет что она вообще делает и ее код ? просто так  очень трудно будет тебе помочь .. вообщем извини если что но я не телепат ... 

это равно-сильно тому что я тебе напишу:
Код

void MainWindow::getInfo(){
qDebug()<<"Start";
myFunction();
qDebug()<<"Stop";
}


и пойми почему моя программа не выполняет функцию myFunction() ? 

Автор: kinetik 30.6.2011, 00:29
Цитата(loneybibi @ 27.6.2011,  23:00)
если GUI отзывчивый то значит функция либо уже закончила свою работу и больше ничего не делает (или не может выполнить себя в крайнем случае ), или функция (как  ты ее там делаешь я не знаю) выполняется в другом потоке параллельном и в таком случае естественно GUI будет полностью (отзывчив) функционировать как отдельный поток! что вызывает функция apiCalls !? , если не секрет что она вообще делает и ее код ? просто так  очень трудно будет тебе помочь .. вообщем извини если что но я не телепат ... 

это равно-сильно тому что я тебе напишу:
Код

void MainWindow::getInfo(){
qDebug()<<"Start";
myFunction();
qDebug()<<"Stop";
}


и пойми почему моя программа не выполняет функцию myFunction() ?

Я не прошу разобраться в моем коде, я обозначил проблему и только хочу услышать мнения в какую сторону копать. Все объяснено в первом посте и достаточно полно. То что ты написал смешно и ты не понял даже сути проблемы smile

Автор: loneybibi 30.6.2011, 01:24
Цитата(kinetik @ 29.6.2011,  23:29)
Цитата(loneybibi @ 27.6.2011,  23:00)
если GUI отзывчивый то значит функция либо уже закончила свою работу и больше ничего не делает (или не может выполнить себя в крайнем случае ), или функция (как  ты ее там делаешь я не знаю) выполняется в другом потоке параллельном и в таком случае естественно GUI будет полностью (отзывчив) функционировать как отдельный поток! что вызывает функция apiCalls !? , если не секрет что она вообще делает и ее код ? просто так  очень трудно будет тебе помочь .. вообщем извини если что но я не телепат ... 

это равно-сильно тому что я тебе напишу:
Код

void MainWindow::getInfo(){
qDebug()<<"Start";
myFunction();
qDebug()<<"Stop";
}


и пойми почему моя программа не выполняет функцию myFunction() ?

Я не прошу разобраться в моем коде, я обозначил проблему и только хочу услышать мнения в какую сторону копать. Все объяснено в первом посте и достаточно полно. То что ты написал смешно и ты не понял даже сути проблемы smile

Да все я понял. Просто ты так описываешь проблему что грубо говоря тут может быть что угодно!
Попробуй при использовании GUI приложения Debug функции Qt:
Код

qDebug()<<"Debug 1";
apiCalls();
qDebug()<<"Debug 2";

Скорее всего что apiCalls работает в другом потоке если GUI остается отзывчив. Но при этом не переходит к выполнению следующей инструкции. Т.е. если к примеру QLoopEvent (цикл) запустить вместо apiCalls(), и поставить к примеру псевдо много-поточность qApp->processEvents() то до завершения цикла (QLoopEvent::quit()) программа к метке Debug 2 не дойдет но GUI будет доступен. Это я к тому что  если даже взять пример с отображением процесса загрузки файла к примеру, если по правильному, то GUI работает в одном потоке а файл грузится в другом, вот так же и тут. Просто не понятно как ты вызываешь стороннюю функцию и как она работает, может она сама по себе обрабатывается отдельным потоком, при этом GUI остается доступным но до завершения выполнения функции дальше перейти к инструкции не может.
Надеюсь смысл того что я хотел сказать понятен.
Я конечно извиняюсь мне иногда трудно выразить мысль, потому как я любитель а не профессионал. smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)