Название: Почему при закрытии главного окна программы цикл while не обрывается
Отправлено: eldar85 от Декабрь 18, 2010, 00:43
Давно уже хочу решить этот вопрос для себя да как то все не доходилось, заметил такую вещь, если идет непрерывный цикл while и обрывается к примеру лишь на нажатие кнопки стоп. Но если мы закрываем главное окно, то этот цикл зацикливается - окно закрывается а программа начинает работать с невероятной скоростью забивая проц и крутя этот цикл пока прогу не сбросишь в диспетчере задачь... возможно вопрос детский, но я не знаю на него ответа - помогите пожалуйста кто знает.
Название: Re: Почему при закрытии главного окна программы цикл while не обрывается
Отправлено: crossly от Декабрь 18, 2010, 02:19
код покажите...
Название: Re: Почему при закрытии главного окна программы цикл while не обрывается
Отправлено: eldar85 от Декабрь 18, 2010, 03:28
основная функция работы программы, программа сравнивает текущий ИП пользователя и Какой у него устанавлен и если они различаются меняет. Так вот если не нажить кнопку стоп а просто закрыть окно то происходит жесткое зацикливание. #include "mainwindow.h" #include "ui_mainwindow.h"
bool MainWindow::stop_bool = false;
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); helper = new helperClass; net = new as_network; startSettings(); }
MainWindow::~MainWindow() { delete ui; }
void MainWindow::changeEvent(QEvent *e) { QMainWindow::changeEvent(e); switch (e->type()) { case QEvent::LanguageChange: ui->retranslateUi(this); break; default: break; } }
void MainWindow::logPassTime() { ui->label_5->setText("Запущено!"); stop_bool = false; saveSettings();
QString tmp1; QString tmp2; QString tmp3; QString uid; QString cookie;
l:
login = ui->lineEdit->text(); password = ui->lineEdit_2->text(); time = ui->doubleSpinBox->value() * 60000;
xByte = net->load("http://awmproxy.com/user.php") ->setPost("uname=" + login + "&pass=" + password + "&rememberme=On&op=login") ->setRef("http://awmproxy.com/") ->exec();
if(stop_bool){ ui->label_5->setText("Остановлено!"); return;}
cookie = net->getCookie();
xByte = net->load("http://awmproxy.com/cabinet.php") ->setRef("http://awmproxy.com/user.php") ->setCookie(cookie) ->exec();
if(stop_bool){ ui->label_5->setText("Остановлено!"); return;}
while(!stop_bool) //вот этот цикл { if(stop_bool){ ui->label_5->setText("Остановлено!"); return;}
xByte = net->load("http://awmproxy.com/edituser.php") ->setRef("http://awmproxy.com/cabinet.php") ->setCookie(cookie) ->exec();
tmp1 = helper->regex("IpSocksAccess\\[\\]\" value=\"([.0-9]*)", xByte); tmp2 = helper->regex("You IP:([.0-9]*)", xByte); qDebug() << tmp1; qDebug() << tmp2;
if(tmp1 != tmp2) { uid = helper->regex("uid' value='(\\d+)", xByte); qDebug() << uid; net->load("http://awmproxy.com/edituser.php") ->setCookie(cookie) ->setPost("IpSocksAccess[]=" + tmp2 + "+&op=savesocksconfig&uid=" + uid) ->setRef("http://awmproxy.com/edituser.php") ->exec(); ui->label_5->setText("Изменено: " + tmp2); } else { if(tmp1.isEmpty() || tmp2.isEmpty()) { ui->label_5->setText("Перелогиниваемся!"); helper->mySleep(10000); goto l; } else ui->label_5->setText("Остался прежним: " + tmp2); }
helper->mySleep(time); } ui->label_5->setText("Остановлено!"); }
Название: Re: Почему при закрытии главного окна программы цикл while не обрывается
Отправлено: Fat-Zer от Декабрь 18, 2010, 03:54
основная функция работы программы, программа сравнивает текущий ИП пользователя и Какой у него устанавлен и если они различаются меняет. Так вот если не нажить кнопку стоп а просто закрыть окно то происходит жесткое зацикливание.
Из вашего кода не видны ни какие сигналы и слоты... ни обработчик кнопки стоп, ни обработчик закрытия окна... Помогло хотя бы объявление, MainWindow и пара коментариев о его членах(helper, net, xByte)
Название: Re: Почему при закрытии главного окна программы цикл while не обрывается
Отправлено: eldar85 от Декабрь 18, 2010, 04:22
QByteArray xBate; net - работает с сетью через QNetworkAccessManager, возвращает QByteArray - ответ сервера на запрос, тоесть обычную HTML страничку. helper - содиржит в себе QRexExp (кажется не правильно написал, в общем регулярные выражения) и ожидание типа sleep. но дело не в них, они то как раз завершаются отлично, продолжает работать цикл while он начинает гонять цикл с безумной скоростью после закрытия окна, но ведь при закрытии окна должны же и удалиться все члены программы...
Название: Re: Почему при закрытии главного окна программы цикл while не обрывается
Отправлено: eldar85 от Декабрь 18, 2010, 04:38
mainwindow.cpp #include "mainwindow.h" #include "ui_mainwindow.h"
bool MainWindow::stop_bool = false;
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); helper = new helperClass; net = new as_network; startSettings(); }
MainWindow::~MainWindow() { delete net; delete helper; delete ui; }
void MainWindow::changeEvent(QEvent *e) { QMainWindow::changeEvent(e); switch (e->type()) { case QEvent::LanguageChange: ui->retranslateUi(this); break; default: break; } }
void MainWindow::saveSettings() { helper->file_save("settings.ini", "---login---" + ui->lineEdit->text().toAscii() + "\n---password---" + ui->lineEdit_2->text().toAscii() + "\n---time---" + QString::number(ui->doubleSpinBox->value()).toAscii()); }
void MainWindow::startSettings() { QString tmp = helper->file_read("settings.ini"); ui->lineEdit->setText(helper->regex("---login---([^\n]*)\n", tmp)); ui->lineEdit_2->setText(helper->regex("---password---([^\n]*)\n", tmp)); ui->doubleSpinBox->setValue(helper->regex("---time---(.+)", tmp).toDouble()); }
void MainWindow::stop() { stop_bool = true; helper->loop2.quit(); net->loop.quit(); }
void MainWindow::logPassTime() { ui->label_5->setText("Запущено!"); stop_bool = false; saveSettings();
QString tmp1; QString tmp2; QString uid; QString cookie;
l:
login = ui->lineEdit->text(); password = ui->lineEdit_2->text(); time = ui->doubleSpinBox->value() * 60000;
xByte = net->load("http://awmproxy.com/user.php") ->setPost("uname=" + login + "&pass=" + password + "&rememberme=On&op=login") ->setRef("http://awmproxy.com/") ->exec();
if(stop_bool){ ui->label_5->setText("Остановлено!"); return;}
cookie = net->getCookie();
xByte = net->load("http://awmproxy.com/cabinet.php") ->setRef("http://awmproxy.com/user.php") ->setCookie(cookie) ->exec();
if(stop_bool){ ui->label_5->setText("Остановлено!"); return;}
while(!stop_bool) { if(stop_bool){ ui->label_5->setText("Остановлено!"); return;}
xByte = net->load("http://awmproxy.com/edituser.php") ->setRef("http://awmproxy.com/cabinet.php") ->setCookie(cookie) ->exec();
tmp1 = helper->regex("IpSocksAccess\\[\\]\" value=\"([.0-9]*)", xByte); tmp2 = helper->regex("You IP:([.0-9]*)", xByte); qDebug() << tmp1; qDebug() << tmp2;
if(tmp1 != tmp2) { uid = helper->regex("uid' value='(\\d+)", xByte); qDebug() << uid; net->load("http://awmproxy.com/edituser.php") ->setCookie(cookie) ->setPost("IpSocksAccess[]=" + tmp2 + "+&op=savesocksconfig&uid=" + uid) ->setRef("http://awmproxy.com/edituser.php") ->exec(); ui->label_5->setText("Изменено: " + tmp2); } else { if(tmp1.isEmpty() || tmp2.isEmpty()) { ui->label_5->setText("Перелогиниваемся!"); helper->mySleep(10000); goto l; } else ui->label_5->setText("Остался прежним: " + tmp2); }
helper->mySleep(time); } ui->label_5->setText("Остановлено!"); }
mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H
#include <QtGui> #include <QtCore> #include "helper.h" #include "as_network.h"
namespace Ui { class MainWindow; }
class MainWindow : public QMainWindow { Q_OBJECT
public: MainWindow(QWidget *parent = 0); ~MainWindow();
static bool stop_bool;
QString login; QString password; double time; QByteArray xByte;
helperClass* helper; as_network* net;
void saveSettings(); void startSettings();
protected: void changeEvent(QEvent *e);
private: Ui::MainWindow *ui;
private slots: void logPassTime(); void stop(); };
#endif // MAINWINDOW_H
main.cpp #include <QtGui> #include "mainwindow.h"
int main(int argc, char *argv[]) { QApplication a(argc, argv); QTextCodec::setCodecForTr(QTextCodec::codecForName("windows-1251")); QTextCodec::setCodecForCStrings(QTextCodec::codecForName("windows-1251")); MainWindow w; w.show();
return a.exec(); }
Название: Re: Почему при закрытии главного окна программы цикл while не обрывается
Отправлено: eldar85 от Декабрь 18, 2010, 04:43
если нажать кнопку стоп и закрыть окно то нормально все, но если просто закрыть окно то цикл фигачит после закрытия окна. вы не знаете где находится функция закрывающая окно? может в нее поставить прерывание цикла к примеры stop_bool сделать true... хотя ну не должно же так быть...
Название: Re: Почему при закрытии главного окна программы цикл while не обрывается
Отправлено: Fat-Zer от Декабрь 18, 2010, 05:19
Всё равно не вижу, где вы вешаете сигнал от кнопки на его обработчик... ну да ладно... По сабжу: При закрытии окна генерируется сигнал close(), то есть надо на него подвесить ваш обработчик остановки, в конструктор добавить что-то типа connect(this, SIGNAL(close()),this, SLOT(stop()))
Соображения по причинам сказать сложно, ибо не понимаю, как работает helper->mySleep(time). я бы вместо этой большой функции сделал несколько маленьких... а вместо цикла и этой задержки ввёл бы таймер, по сигналу от которого и производил повторные попытки... В общем странно, что вообще хоть что-то работает... ЗЫ: У вас же всё это выполняется в одном потоке?
Название: Re: Почему при закрытии главного окна программы цикл while не обрывается
Отправлено: eldar85 от Декабрь 18, 2010, 14:40
да в одном потоке.
Название: Re: Почему при закрытии главного окна программы цикл while не обрывается
Отправлено: eldar85 от Декабрь 18, 2010, 14:46
ну цикл то должен все равно работать правильно, тоесть в нем должна быть цикличность - я возможно делаю что то не правильно, но при закрытии окна дожно же все удаляться и цикл в том числе или нет?
Название: Re: Почему при закрытии главного окна программы цикл while не обрывается
Отправлено: Fat-Zer от Декабрь 18, 2010, 15:37
по идее событие вообще не должно отлавливаться, пока процесс находится в цикле и не освобождает процессор(если б использовался бы обычный sleep(10) например), у вас же каким-то чудом цикл обработки событий не блокируется в силу вашей реализации helperClass::sleep()
ЗЫ: почему кнопка Стоп работает тоже не понятно))
|