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

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

Страниц: 1 2 [3]   Вниз
  Печать  
Автор Тема: QHttp  (Прочитано 23730 раз)
kadr
Гость
« Ответ #30 : Февраль 04, 2010, 15:06 »

Но это еще не все, скачать один фаилик у меня получилось, вопрос, как мне скачать много файлов, загоняю в цикл:
Код:
while(i != sp.count())
    {
        file.setFileName("files/"+sp.value(i));
        file.open(QIODevice::WriteOnly);
        request.setUrl(QUrl("http://192.168.1.223/farma/zagruz/"+sp.value(i)));

        manager.moveToThread(QApplication::instance()->thread());
        reply = manager.get(request); //Отправляем запрос
        reply->moveToThread(QApplication::instance()->thread());
        connect(&manager, SIGNAL(finished(QNetworkReply*)),this, SLOT(replyFinished(QNetworkReply*)));
        connect(reply,SIGNAL(readyRead()),this,SLOT(readyRead()));
        i++;
    }
создаются файли и все пустые! В QStringList sp у меня храняться именя всех файлов на серваке! Полученные при загрузке программы!
« Последнее редактирование: Февраль 04, 2010, 15:08 от kadr » Записан
crossly
Гость
« Ответ #31 : Февраль 04, 2010, 15:34 »

а как с слот readyRead определяет в какой файл писать??
Записан
kadr
Гость
« Ответ #32 : Февраль 04, 2010, 15:40 »

а как с слот readyRead определяет в какой файл писать??
file.setFileName("files/"+sp.value(i));
file.open(QIODevice::WriteOnly);
Записан
crossly
Гость
« Ответ #33 : Февраль 04, 2010, 15:45 »

ладно... по другому... как ты определяешь где заканчиваются данные одного файла и начинаются другого.... я не работал accessmanager'ом .... но что то мне подсказывает что работает это дело в асинхронном режиме...
Записан
kadr
Гость
« Ответ #34 : Февраль 04, 2010, 18:50 »

ладно... по другому... как ты определяешь где заканчиваются данные одного файла и начинаются другого.... я не работал accessmanager'ом .... но что то мне подсказывает что работает это дело в асинхронном режиме...

Вот за этим я суда и обратился, у меня получается скачать только 1 файл, а мне надо много, кто в курсе как это осуществить, помогите!
Записан
voronElf
Гость
« Ответ #35 : Февраль 05, 2010, 07:05 »

ну если проблема только в том, чтобы разделить файлы, а само скачивание файла реализовано, тогда можно предложить 2 подхода:

1. Для случая если ты из одного цикла запускаешь кучу закачек на все файлы, тогда надо формировать в памяти структуру соответствия экземпляра (адреса) QNetworkReply с именем файла. Например QMap<QNetworkReply*, QString> как внутренняя переменная класса (конечно не на стеке ее делать). Слот-приемщик данных по адресу QNetworkReply* будет определять в какой файл писать данные.

2. Качаешь файлы один за другим. Запускаешь скачивание первого файла, в слоте получения данных пишешь данные в текущий файл. Здесь же в слоте запускаешь скачивание второго файла и так далее пока список файлов не кончится.
Записан
kadr
Гость
« Ответ #36 : Февраль 05, 2010, 13:34 »

ну если проблема только в том, чтобы разделить файлы, а само скачивание файла реализовано, тогда можно предложить 2 подхода:

2. Качаешь файлы один за другим. Запускаешь скачивание первого файла, в слоте получения данных пишешь данные в текущий файл. Здесь же в слоте запускаешь скачивание второго файла и так далее пока список файлов не кончится.
Вот про второй можно маленько поподробнее! Как запустить скачивание второго и последующих файлов, не представляю!
Код:
void nomkl_num::readyRead()
{       
    file.setFileName("files/"+sp.value(zakaz));
    file.open(QIODevice::WriteOnly);
    file.write(reply->readAll());
    zakaz++;
}
« Последнее редактирование: Февраль 05, 2010, 13:37 от kadr » Записан
voronElf
Гость
« Ответ #37 : Февраль 05, 2010, 14:30 »

я делал так: отдельный метод класса (назовем send() ), отправляющий запрос на очередной файл. В слоте повешенном на сигнал finished в самом конце после всех обработок делаю вызов send()
Записан
kadr
Гость
« Ответ #38 : Февраль 08, 2010, 16:16 »

Попробовал сделать так, выскакивает ошибка
Код:
void  nomkl_num::send_save_file()
{
        request.setUrl(QUrl("http://192.168.1.223/farma/zagruz/"+sp.value(zakaz)));
        manager.moveToThread(QApplication::instance()->thread());
        reply = manager.get(request); //Отправляем запрос
        reply->moveToThread(QApplication::instance()->thread());
        connect(reply,SIGNAL(readyRead()),this,SLOT(readyRead()));
        connect(&manager, SIGNAL(finished(QNetworkReply*)),this, SLOT(replyFinished(QNetworkReply*)));
}

void nomkl_num::readyRead()
{      
    QStringList sl;
    sl = reply->url().path().split("/");
    file.setFileName("files/"+sl.value(3));
    file.open(QIODevice::WriteOnly);
    file.write(reply->readAll());  
  
}

void nomkl_num::replyFinished(QNetworkReply *)
{
    if (reply->error())
       {
        QMessageBox::information(this,tr("error download"),reply->errorString(),QMessageBox::Ok);

       }
    else
       {
           //QMessageBox::information(this,tr("Сообщение"),tr("Загрузка завершена успешно"),QMessageBox::Ok);
           qDebug() << "download complete";
           file.close();
           zakaz++;
           send_save_file();
       }
}
После того как скачал 4 файла, не останавлиывается, и программа зависает, от того что он уходит в бесконечность, и почему то 1 файл не качает, сохраняет 3 из 4.
« Последнее редактирование: Февраль 08, 2010, 16:56 от kadr » Записан
voronElf
Гость
« Ответ #39 : Февраль 09, 2010, 06:33 »

несколько моих имхо по коду:

1. зачем перемещать объекты в треды какие-то, запрос итак асинхронно выполняется в другом треде, это скрыто в реализации managera.

2. request у меня локальная переменная на стеке функции (ну тут большой разницы не должно быть).

3. коннект сигнала finished от manager достаточно сделать один раз (в конструкторе), а не при каждом вызове send ()

4. открывать файл в одном слоте и закрывать в другом не есть хорошо (файл может и не закрыться), мне проще reply->readAll() делать в finished  и писать в файл в этом же слоте.


Ну а теперь почему не останавливается - в коде не вижу условия на остановку процесса. Получается же своего рода рекурсия: 1-я функция порождает вызов второй, вторая в свою очередь явно вызывает первую. Если не прописать явного условия выхода - конечно бесконечный цикл получим. А условие выхода такое: в функции send() если список файлов закончился, то не отправлять очередной запрос, а возврат. Список файлов я так понимаю это sp, кстати имя скачанного файла как то эстетичнее из этого списка и брать (текущую позицию знаем), а не из url вырезать.

PS: поборешь зависание, там можт и видно станет, почему не все файлы скачивает
Записан
kadr
Гость
« Ответ #40 : Февраль 09, 2010, 15:12 »

Спасибо, вреде сделал, надо было этот send(), в моем случае send_save_file(), не на finished вешать, а на readyRead().
Код:
QStringList sl;
    sl = reply->url().path().split("/");
    file.setFileName("files/"+sl.value(3));
    file.open(QIODevice::WriteOnly);
    file.write(reply->readAll());
    file.close();
    sl.clear();
    zakaz++;
    kol++;
    send_save_file();

   if (kol == sp.count())
    {
       load();
    }
« Последнее редактирование: Февраль 09, 2010, 15:15 от kadr » Записан
voronElf
Гость
« Ответ #41 : Февраль 10, 2010, 06:29 »

можно и все на readyRead повешать, можно на finished. Я предпочел 2-й вариант, из-за того что reply нужно удалять ручками. Тема поднималась тут
Записан
Страниц: 1 2 [3]   Вверх
  Печать  
 
Перейти в:  


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