Здравствуйте, такой вопрос: у меня в проекте реализована загрузка файлов

с сервера посредством связывания через
connect(reply, &QNetworkReply::finished, this, &UpdateChecker::updatingFiles);

(в `updatingFiles()`ответ обновляется через sender())

QNetworkReply * reply = dynamic_cast<QNetworkReply*>(sender());

Это решение работало, до недавного времени, когда сервер перестал справляться с многопоточной нагрузкой.

Собственно вопрос: как реализовать последовательную загрузку файлов?

Пробовал использовать QRunnable и QThreadPool. Пока не получается.
Вот ссылка на эту попытку:

https://ru.stackoverflow.com/questions/1338319/%d0%9a%d0%b0%d0%ba-%d0%bf%d0%be%d1%81%d0%bb%d0%b5%d0%b4%d0%be%d0%b2%d0%b0%d1%82%d0%b5%d0%bb%d1%8c%d0%bd%d0%be-%d0%b7%d0%b0%d0%b3%d1%80%d1%83%d0%b7%d0%b8%d1%82%d1%8c-%d1%84%d0%b0%d0%b9%d0%bb%d1%8b-%d1%81-%d0%bf%d0%be%d0%bc%d0%be%d1%89%d1%8c%d1%8e-qthreadpool-qrunnable-%d0%b8-qnetworkr

23 ответов

25 просмотров

а точно сервер не блокирует по числу запросов? достаточно не отправлять новый запрос пока прошлый файл не докачается

Yura- Автор вопроса
mefest
а точно сервер не блокирует по числу запросов? дос...

Так использую же finished в качестве сигнала. Должен уже скачаться

Yura
Так использую же finished в качестве сигнала. Долж...

QThreadPool для запуска задач в потоках. для скачивания файлов один за другим последовательно это не подходит. должно хватить одного main потока.

Yura- Автор вопроса
mefest
QThreadPool для запуска задач в потоках. для скачи...

Хорошо, но как тогда загружать файлы в одном потоке?

Yura
Хорошо, но как тогда загружать файлы в одном поток...

QNAM и так будет делать параллельно несколько задач.. количество "параллельных" скачек у них хардкодно зашито в коде и не меняется

Yura
Хорошо, но как тогда загружать файлы в одном поток...

если правильно понял твои требования, то сначала сохранять файл, а после этого отправлять следующий запрос через qnam

Юрий Александров
QNAM и так будет делать параллельно несколько зада...

вроде было 5 одновременных запросов на один хост:порт

mefest
вроде было 5 одновременных запросов на один хост:п...

я честно не помню, ну что то типа у них это объясняется там какой то политикой корректности.. ну можно обойти сделав пул из QNAM если очень надо

Yura- Автор вопроса
mefest
если правильно понял твои требования, то сначала с...

блин логично. Сильно затупил. Попробую. Огромное спасибо!

mefest
можно, но это совсем другая задача

ну если больше 5 одновременно надо

Юрий Александров
ну если больше 5 одновременно надо

я не спорю, если такие требования то да

Юрий Александров
QNAM и так будет делать параллельно несколько зада...

4-е. Но Nam - асинхронно работает, потому для нас кажется что параллельных задач много больше

mefest
если правильно понял твои требования, то сначала с...

вовсе нет необходимости их строго последовательно выполнять-сохранять. А вообще конечно правильно бы сделать - организовать очередь.. можно и без нее, если есть список файлов для скачки. Он и будет выступать "очередью". Ограничить (это как душе угодно из каких угодно соображений) кол-во одновременных запросов (строго параллельно один NaM может выполнить 4-е запроса), но никто не мешает нам сделать столько NaM, сколько мы хотим в разумных пределах. Создать Любой контейнер для хранения NaM'ов. Я часто использую даже QMap<Nam,reply> хотя это избыточно, но мне порой удобнее. обрабатывать лучше не nam->finished, а reply->finished, а заодно и reply>downloadProgress писать в контейнер NAM при старте запроса, выкидывать при окончании, и не делать новых запросов, пока размер контейнера больше заданного лимита. P.S. перекиньте автору :) я заблудился в мессагах по теме

Angry Subst
вовсе нет необходимости их строго последовательно ...

почему нет необходимости последовательно их выполнять? этого и хотел добиться спрашивающий

mefest
почему нет необходимости последовательно их выполн...

ну возможно я не так понял, и невнимательно ну с последовательной загрузкой вообще откуда проблемы то.. странно

Angry Subst
вовсе нет необходимости их строго последовательно ...

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

mefest
или ты про то что можно сразу очередь организовать...

да нет, наверное я не так поянл. вон выше а вообще сделав контейнер для хранения Nam'ов которые в работе, можно огграничить их кол-во Одним и будет последовательно строго :)

Yura- Автор вопроса
Angry Subst
вовсе нет необходимости их строго последовательно ...

А как ограничить NAM? Я использую примерно такую конструкцию: While(item != item.end()) { QNetworkReplay *replay = m_manager.get(Qrequest(QUrl(str))); connection (replay, signal(finished), this, slot(download)); ++item; }

Yura
А как ограничить NAM? Я использую примерно такую к...

Ну просто же очень всё 1. создавай Nam динамически при запросе 2. создай контейнер-член класса и складывай туда Nam, например член класса QList <QNam> m_namList; в твоем методе while (m_namList.size() > ...) qApp->processEvents(); Nam *nam=new QNam(...) reply=nam->get(...) connection() m_namList<<nam; в reply::onFinished do_something nam->deleteLater(); m_namList.removeOne(nam);

Angry Subst
Ну просто же очень всё 1. создавай Nam динамическ...

ну не знаю.. создавать Nam просто ради того чтобы на finished взять из очереди следующий url и его обработать.. еще и while () processEvents()

Юрий Александров
ну не знаю.. создавать Nam просто ради того чтобы ...

это сугубо ваше право :) если же надо сугубо последовательно сделать в твоем случае ну подними флаг работы после get и сбрось его в finished()

Похожие вопросы

Обсуждают сегодня

Добрый вечер, Пока не совсем понимаю как наладить общение между телеграм ботом и ПО для работы с сим боксом. По самому боту так понял: - Нужен некий баланс, который можно поп...
Magic
6
сделал сайт, прикрутил в боте сайт, и виджет логина. как автоматически логинить пользователя в аккаунт(телеграм), при входе с бота?
Александра Чернивецкая
5
Объясните, пожалуйста, почему компилятор ругается на использование в условии неинициализированной переменной: int x; Task.Run(async () => { x = await somefunc(); }).Wait...
Александр
5
Ребят, подскажите, пожалуйста, почему в префиксе к ассетам, которые генерируются через фильтр | theme в шаблоне, стал вдруг появляться index.php? Вот так выглядит ссылка на а...
Виталий
1
Всем привет. Ребята, подскажите, пожалуйста. у ботов есть ограничение на отправку сообщений - 30 сообщений в секунду, эти ограничения накладываются на все сообщения? или на со...
Artem Stormageddon
4
Блин, ребята, сори за тупые вопросы. А можно ли как-то открыть вебапку по нажатию на кнопку в меню(которое появляется слева, команды)?
Artem Stormageddon
3
а плаксы из-под питона умеют только в комфортных условиях что-то выдавить из себя?)
Lencore
9
Но, может, есть уже проверенная? Наши требования такие: 1. Сообщения должны приходить из Инста в CRM оду 2. Должна быть возможность подключить несколько экаунтов Инстаграм. Р...
Alexander Sharoiko MSE / Александр Шаройко
13
Это может быть все-таки не флудвейт? у меня ботфазер принимает изменения и отображает даже что они изменились, на видео видно что он прислал якобы уже измененное описание, н...
OVERLINK
13
Коллеги, может знает кто, можно ли цвет бейджа счётчика в BackendMenu менять без бубнов?
Alex Blaze
3
Карта сайта