Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: hanabad от Ноября 19, 2010, 23:31



Название: [Решено] самозавершение приложения
Отправлено: 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();
}
Помогите, пожалуйста.


Название: Re: самозавершение приложения
Отправлено: SimpleSunny от Ноября 20, 2010, 00:45
Добавьте разметку к коду. [ code=cpp] [ /code]


Название: Re: самозавершение приложения
Отправлено: Пантер от Ноября 20, 2010, 09:59
Код
C++ (Qt)
qApp->quit();
return a.exec();
 
Замени на
Код
C++ (Qt)
return 0
 


Название: Re: самозавершение приложения
Отправлено: DmP от Ноября 20, 2010, 10:28
Код
C++ (Qt)
qApp->quit();
return a.exec();
 
Замени на
Код
C++ (Qt)
return 0
 
Нельзя, там же надо сначала отправить запрос, а он без exec() не уйдет. Наверное нужно перехватывать сигнал об удачной отправке и там quit()


Название: Re: самозавершение приложения
Отправлено: hanabad от Ноября 20, 2010, 12:19
Да действительно если последние две строчки заменить на return 0;
модем перестает перезагружаться.
(Наверно надо было создавать тему в "Работа с сетью")


Название: Re: самозавершение приложения
Отправлено: BRE от Ноября 20, 2010, 12:22
Ну так:
нужно перехватывать сигнал об удачной отправке и там quit()
Точнее о сигнал завершении.


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


Название: Re: самозавершение приложения
Отправлено: Denjs от Ноября 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().


Название: Re: самозавершение приложения
Отправлено: hanabad от Ноября 20, 2010, 13:00
Блин и вправду исправил все одной строкой:
предпоследнюю строку (qApp->quit()) я заменил на

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

и никаких проблем!
Всем спасибо!


Название: Re: самозавершение приложения
Отправлено: whirlwind от Ноября 20, 2010, 23:46
qApp->quit();
(по моей памяти и моим представлениям, возможно ошибочным) qApp->quit() не работает вне запущенного цикла событий ("eventloop"). Или (что в принципе аналогично) не работает для "не-запущенного qApp". (надеюсь вам понятно что ваша a и qApp - это одно и то же?)
quit() не завершает программу, он просто  прерывает evenloop.
А если eventloop не запущен, но и прерывать нечего :)