Russian Qt Forum
Июня 14, 2025, 21:57 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [Решено] самозавершение приложения  (Прочитано 4785 раз)
hanabad
Гость
« : Ноября 19, 2010, 23:31 »

Доброго времени суток всем!
Вобщем проблемма такая:
После отработки кода (рекконект модема) прога должна сама завершать свою работу,
однако этого не происходит (висит в процессах)
вот код:
Код
C++ (Qt)
#include <QtGui>
#include <QtNetwork>
 
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QFile file("psswrd.dat");// в файле через пробел логин и пасс
QStringList listread;
QString tmp;
if(file.open(QIODevice::ReadOnly))
 {
  tmp = file.readAll();
  listread = tmp.split(" ");
 }
file.close();
QNetworkReply *reply;
QByteArray requestString;
requestString.append("var%3Amain=menu&var%3Astyle=style5&getpage=..%2Fhtml%2Fdefs%2Fstyle5%2Fmenus%2Fmenu.html&errorpage=..%2Fhtml%2Findex.html&var%3Apagename=home&var%3Aerrorpagename=home&var%3Amenu=home&var%3Amenutitle=Home&var%3Apagetitle=Home&var%3Apagemaster=home&login%3Acommand%2Fusername="+listread[0]+"&login%3Acommand%2Fpassword="+listread[1]);
QNetworkRequest request;
request.setUrl(QUrl("http://192.168.1.1/cgi-bin/webcm"));
QNetworkAccessManager manager;
reply = manager.post(request, requestString);
requestString.clear();
   requestString.append("var%3Amain=menu&var%3Astyle=style5&getpage=..%2Fhtml%2Fdefs%2Fstyle5%2Fmenus%2Fmenu.html&errorpage=..%2Fhtml%2Fdefs%2Fstyle5%2Fmenus%2Fmenu.html&var%3Apagename=commands&var%3Aerrorpagename=&var%3Amenu=tools&var%3Amenutitle=Tools&var%3Apagetitle=System+Commands&var%3Apagemaster=&logic%3Acommand%2Freboot=");
reply = manager.post(request, requestString);
qApp->quit();
return a.exec();
}
Помогите, пожалуйста.
« Последнее редактирование: Ноября 20, 2010, 13:03 от hanabad » Записан
SimpleSunny
Гость
« Ответ #1 : Ноября 20, 2010, 00:45 »

Добавьте разметку к коду. [ code=cpp] [ /code]
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5877


Жаждущий знаний


Просмотр профиля WWW
« Ответ #2 : Ноября 20, 2010, 09:59 »

Код
C++ (Qt)
qApp->quit();
return a.exec();
 
Замени на
Код
C++ (Qt)
return 0
 
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
DmP
Гость
« Ответ #3 : Ноября 20, 2010, 10:28 »

Код
C++ (Qt)
qApp->quit();
return a.exec();
 
Замени на
Код
C++ (Qt)
return 0
 
Нельзя, там же надо сначала отправить запрос, а он без exec() не уйдет. Наверное нужно перехватывать сигнал об удачной отправке и там quit()
Записан
hanabad
Гость
« Ответ #4 : Ноября 20, 2010, 12:19 »

Да действительно если последние две строчки заменить на return 0;
модем перестает перезагружаться.
(Наверно надо было создавать тему в "Работа с сетью")
« Последнее редактирование: Ноября 20, 2010, 12:28 от hanabad » Записан
BRE
Гость
« Ответ #5 : Ноября 20, 2010, 12:22 »

Ну так:
нужно перехватывать сигнал об удачной отправке и там quit()
Точнее о сигнал завершении.
Записан
DmP
Гость
« Ответ #6 : Ноября 20, 2010, 12:30 »

Ну так:
нужно перехватывать сигнал об удачной отправке и там quit()
Точнее о сигнал завершении.
Да, да, верно. Там вообще все можно исправить одной строчкой. Улыбающийся
Записан
Denjs
Гость
« Ответ #7 : Ноября 20, 2010, 12:54 »

qApp->quit();
(по моей памяти и моим представлениям, возможно ошибочным) qApp->quit() не работает вне запущенного цикла событий ("eventloop"). Или (что в принципе аналогично) не работает для "не-запущенного qApp". (надеюсь вам понятно что ваша a и qApp - это одно и то же?)

Более того -  вы в конце вашего майна, фактически его(цикл событий и прилжение) и запускаете: return a.exec();
нестыковка понятна?

Цитировать
Нельзя, там же надо сначала отправить запрос, а он без exec() не уйдет. Наверное нужно перехватывать сигнал об удачной отправке и там quit()
какой вывод? меняйте архитектуру приложения.
Выносите вашу полезную функциональность в отдельный класс, его объект создавайте в майне, подключайте к нему сигналы об окончании обработки и в них уже делайте "qApp->quit();".

А что бы класс начал гарантировано обрабатывать сразу после запуска цикла событий - создайте класс initSender с единственным сигналом, который подключите к слоту вашего "бизнес-класса" содержащему нужную функциональность, и подключите его через "квотед-коннекшн". В initSender создайте процедуру которая испускает сигнал, и вызовите её в майне перед "return a.exec();".

т.к. это квотедконнекшн - сигнал будет доставлен только после запуска цикла событий - а именно - практически сразу после (внутри) a.exec().
Записан
hanabad
Гость
« Ответ #8 : Ноября 20, 2010, 13:00 »

Блин и вправду исправил все одной строкой:
предпоследнюю строку (qApp->quit()) я заменил на

QObject::connect(&manager,SIGNAL(finished (QNetworkReply*)),qApp,SLOT(quit()));

и никаких проблем!
Всем спасибо!
Записан
whirlwind
Гость
« Ответ #9 : Ноября 20, 2010, 23:46 »

qApp->quit();
(по моей памяти и моим представлениям, возможно ошибочным) qApp->quit() не работает вне запущенного цикла событий ("eventloop"). Или (что в принципе аналогично) не работает для "не-запущенного qApp". (надеюсь вам понятно что ваша a и qApp - это одно и то же?)
quit() не завершает программу, он просто  прерывает evenloop.
А если eventloop не запущен, но и прерывать нечего Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 3.144 секунд. Запросов: 22.