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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как реализовать (последовательная или многопоточная авторизация на сайте)  (Прочитано 5583 раз)
thechicho
Гость
« : Октябрь 01, 2011, 20:49 »

в общем пишу прогу для парсинга баланса билайна. 40+ телефонов.
в настоящий момент получилось реализовать парсинг для 1 телефона.
после клика на кнопку, сигнал идет в 1 слот. там формируется запрос, потом сигнал идет во 2ой слот, потом в 3ий, в итоге в 4 слоте я получаю баланс.

как мне сделать, чтобы автоматически пошел еще один "круг" для следующего номера?
или было бы ваще шикарно, если бы это все происходило одновременно. т.е. по потоку на номер телефона (40+). это реально вообще реализовать?
Записан
neversleep
Гость
« Ответ #1 : Октябрь 02, 2011, 12:17 »

Общий принцип примерно такой:

1) Заведи список(QList например) или массив номеров.
2) Вместо сигналов/слотов используй процедуры.
3) В параметрах каждой процедуры передаются необходимые значения.
4) В цикле пробегись по списку вызывая процедуры в нужном порядке. (или вызывая только первую процедуру, а та, в свою очередь, делает вызов второй и тд.)
5) Для многопоточности используй класс QThread.
Записан
thechicho
Гость
« Ответ #2 : Октябрь 02, 2011, 14:47 »

// Вместо сигналов/слотов используй процедуры
можно пример?

просто у меня так ща сделано:
void MainWindow::on_pushButton_clicked()
{
...
QNetworkAccessManager *qnam = new QNetworkAccessManager;
connect(qnam, SIGNAL(finished(QNetworkReply*)), this, SLOT(download1(QNetworkReply*)));
qnam->get(QNetworkRequest(QUrl("https://uslugi.beeline.ru/")));
...
}

void MainWindow::download1(QNetworkReply *reply)
{
    ui->textBrowser->insertPlainText("signal dostig download1()!\n");
    reply->deleteLater();
    if(reply->error() != QNetworkReply::NoError){
        ui->errorLabel->setText(tr("%1").arg(reply->errorString()));
        //return;
    }
    QByteArray answer = reply->readAll();
    ...
}

и я пока не представляю как по-другому реализовать?..
« Последнее редактирование: Октябрь 02, 2011, 15:23 от thechicho » Записан
thechicho
Гость
« Ответ #3 : Октябрь 02, 2011, 15:32 »

как мне это заменить?!
Код
C++ (Qt)
connect(qnam, SIGNAL(finished(QNetworkReply*)), this, SLOT(download1(QNetworkReply*)));
Записан
neversleep
Гость
« Ответ #4 : Октябрь 02, 2011, 16:06 »

// Вместо сигналов/слотов используй процедуры
можно пример?

просто у меня так ща сделано:
void MainWindow::on_pushButton_clicked()
{
...
QNetworkAccessManager *qnam = new QNetworkAccessManager;
connect(qnam, SIGNAL(finished(QNetworkReply*)), this, SLOT(download1(QNetworkReply*)));
qnam->get(QNetworkRequest(QUrl("https://uslugi.beeline.ru/")));
...
}

void MainWindow::download1(QNetworkReply *reply)
{
    ui->textBrowser->insertPlainText("signal dostig download1()!\n");
    reply->deleteLater();
    if(reply->error() != QNetworkReply::NoError){
        ui->errorLabel->setText(tr("%1").arg(reply->errorString()));
        //return;
    }
    QByteArray answer = reply->readAll();
    ...
}

и я пока не представляю как по-другому реализовать?..
Прошу прощения, я не обдуманно ответил.

как мне это заменить?!
Код
C++ (Qt)
connect(qnam, SIGNAL(finished(QNetworkReply*)), this, SLOT(download1(QNetworkReply*)));
Заменить на что? Тебе надо подождать пока запрос выполниться? QNetworkRequest::get() возвращает QNetworkReply*, у которого есть ф-ция isFinished(). Но только делать это всё надо в отдельном потоке.. тогда можно последовательно пробежаться по списку, к примеру:
Код
C++ (Qt)
QList<QString> list;
list << "123" << "456" << "789"; // номера
foreach (QString phone, list) {
...
QNetworkReply *reply = qnam->get(QNetworkRequest(QUrl("https://uslugi.beeline.ru/")));
while (!reply->isFinished()) {
usleep(10);
}
 
if(reply->error() != QNetworkReply::NoError){
...
}
}
 
Записан
thechicho
Гость
« Ответ #5 : Октябрь 02, 2011, 17:44 »

// Прошу прощения, я не обдуманно ответил.
да ты гонишь Смеющийся

//Но только делать это всё надо в отдельном потоке.. тогда можно последовательно пробежаться по списку
а я думал для каждого телефона можно свой поток создать и делать одновременные запросы. это если многопоточность.
а если тупо перебор, то тупо в проге for (int i = 0; i < logins.size(); i++) { }

т.е. эту задачу не решить никак, не создавая отдельного потока?  Обеспокоенный
у меня нету опыта работы с ними, чую что это геморрой Веселый
Записан
thechicho
Гость
« Ответ #6 : Октябрь 02, 2011, 18:03 »

Цитировать
Все операции выполняются асинхронно. Когда вызывается функция, такая как get() или put(), управление сразу же возвращается программе, а собственно передача данных начинает производиться, когда управление опять переходит в цикл обработки событий Qt

поясните плз это на конкретном примере?
Записан
thechicho
Гость
« Ответ #7 : Октябрь 02, 2011, 19:06 »

может как-то можно прикрутить
Код
C++ (Qt)
emit finished();
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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