Russian Qt Forum
Ноябрь 02, 2024, 20:24 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Почему при закрытии главного окна программы цикл while не обрывается  (Прочитано 4688 раз)
eldar85
Гость
« : Декабрь 18, 2010, 00:43 »

Давно уже хочу решить этот вопрос для себя да как то все не доходилось, заметил такую вещь, если идет непрерывный цикл while и обрывается к примеру лишь на нажатие кнопки стоп. Но если мы закрываем главное окно, то этот цикл зацикливается - окно закрывается а программа начинает работать с невероятной скоростью забивая проц и крутя этот цикл пока прогу не сбросишь в диспетчере задачь... возможно вопрос детский, но я не знаю на него ответа - помогите пожалуйста кто знает.
Записан
crossly
Гость
« Ответ #1 : Декабрь 18, 2010, 02:19 »

код покажите...
Записан
eldar85
Гость
« Ответ #2 : Декабрь 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("Остановлено!");
}
« Последнее редактирование: Декабрь 18, 2010, 03:33 от eldar85 » Записан
Fat-Zer
Гость
« Ответ #3 : Декабрь 18, 2010, 03:54 »

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

Из вашего кода не видны ни какие сигналы и слоты... ни обработчик кнопки стоп, ни обработчик закрытия окна...

Помогло хотя бы объявление, MainWindow и пара коментариев о его членах(helper, net, xByte)
« Последнее редактирование: Декабрь 18, 2010, 04:02 от Fat-Zer » Записан
eldar85
Гость
« Ответ #4 : Декабрь 18, 2010, 04:22 »

QByteArray xBate;
net  - работает с сетью через QNetworkAccessManager, возвращает QByteArray  - ответ сервера на запрос, тоесть обычную HTML страничку.
helper - содиржит в себе QRexExp (кажется не правильно написал, в общем регулярные выражения) и ожидание типа sleep.
но дело не в них, они то как раз завершаются отлично, продолжает работать цикл while он начинает гонять цикл с безумной скоростью после закрытия окна, но ведь при закрытии окна должны же и удалиться все члены программы...
Записан
eldar85
Гость
« Ответ #5 : Декабрь 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();
}
« Последнее редактирование: Декабрь 18, 2010, 04:40 от eldar85 » Записан
eldar85
Гость
« Ответ #6 : Декабрь 18, 2010, 04:43 »

если нажать кнопку стоп и закрыть окно то нормально все, но если просто закрыть окно то цикл фигачит после закрытия окна. вы не знаете где находится функция закрывающая окно? может в нее поставить прерывание цикла к примеры stop_bool сделать true... хотя ну не должно же так быть...
Записан
Fat-Zer
Гость
« Ответ #7 : Декабрь 18, 2010, 05:19 »

Всё равно не вижу, где вы вешаете сигнал от кнопки на его обработчик... ну да ладно...
По сабжу:
При закрытии окна генерируется сигнал close(), то есть надо на него подвесить ваш обработчик остановки, в конструктор добавить что-то типа
Код:
connect(this, SIGNAL(close()),this, SLOT(stop()))

Соображения по причинам сказать сложно, ибо не понимаю, как работает helper->mySleep(time).
я бы вместо этой большой функции сделал несколько маленьких... а вместо цикла и этой задержки ввёл бы таймер, по сигналу от которого и производил повторные попытки...
В общем странно, что вообще хоть что-то работает...

ЗЫ: У вас же всё это выполняется в одном потоке?
Записан
eldar85
Гость
« Ответ #8 : Декабрь 18, 2010, 14:40 »

да в одном потоке.
Записан
eldar85
Гость
« Ответ #9 : Декабрь 18, 2010, 14:46 »

ну цикл то должен все равно работать правильно, тоесть в нем должна быть цикличность - я возможно делаю что то не правильно, но при закрытии окна дожно же все удаляться и цикл в том числе или нет?
Записан
Fat-Zer
Гость
« Ответ #10 : Декабрь 18, 2010, 15:37 »

по идее событие вообще не должно отлавливаться, пока процесс находится в цикле и не освобождает процессор(если б использовался бы обычный sleep(10) например), у вас же каким-то чудом цикл обработки событий не блокируется в силу вашей реализации helperClass::sleep()

ЗЫ: почему кнопка Стоп работает тоже не понятно))
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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