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

с сервера посредством связывания через
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 ответов

5 просмотров

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

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()

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

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

Подскажите, а есть vault lite или ченить такое?) А то нужен вольт для похода в вольт, но весит он ~500 мб) как-то многовато для парочки запросов ))
Alexandr Orloff
17
Всем привет, есть небольшая проблема Есть такой скрипт document.addEventListener('DOMContentLoaded', function () { const sliderTabs = document.querySelectorAll('.s...
A da
8
@go1337 @dblackCat Привет. Все ещё дрочусь с fastpanel. Добавил второй домен который должен смотреть в рут того же сайта, но так как это просто домен, а не сайт, я не могу ему...
Ross 🦴
9
До речі, в ево нема можливості чи якого розширення щоб з адмінки з телефона зайти і терміново щось в верстці поправити?
Женя
7
кто-нибудь пользуется тайм-трекерами во время работы? так много разных нагуглил, может есть что-то популярное
Lencore
8
Пацаны. Я разрабатываю софт для инвайтинга на телетон, и столкнулся с такой проблемой, в один из чатов не могу приглашать никого, не дает добавлять, в то же время через официа...
Kernel Panic
11
Скажите, а кому нужен Currency как отдельный плагин вместо полноценного ecommerce в OctoberCMS? Кто-то использует его уже или планирует в будущем? Может я что-то не понимаю?
Igor
13
Розмовами про Рево мені нагадали часи, коли шаблони правилися прямо в адмінці. Хто в курсі, чому відійшли від цієї практики, так блейд не працює? Доволі зручно ж було (інколи)
Женя
3
Всем добрый вечер, Рад оказаться в кругу единомышленников. Начинаю погружаться в мир .net веба. Зовут Ерасыл 🖖 У меня назрел вопрос: Какой процент проектов, прошедшие через в...
Ерасыл
6
Чому? Да тому що без GiT не уявляю нормального проекта а коли код в базі то то так собі
Dmytro Lukianenko
3
Карта сайта