@D3Nd3R

Какую архитектуру выбрать для многопоточного сетевого приложения на Qt?

Я разрабатываю приложение, которое выкачивает с сетевых камер изображения. Затем их обрабатывает. А потом по запросу отправляет результаты (json). Приложение Разрабатывается на Qt, так как мат. библиотека написана на C/C++.
Сейчас я использую QThreadPool, а точнее его global instance, в качества воркеров выступают классы наследованные от QObject(для работы сигналов и слотов) & QRunnable.
Предполагаю, что при большом числе камер и запросов данных могут начаться тормоза:
1. Из-за постоянного создания воркеров для загрузки и отправки данных, которые на самом деле отличаются лишь парой полей;
2. Из-за постоянного переключения контекста.
А теперь собственно сам вопрос:
Какая оптимальная архитектура для такого приложения, если оно разрабатывается на Qt?
P.S. Для загрузки и отправки данных используется QNetworkAccessManager
  • Вопрос задан
  • 1387 просмотров
Решения вопроса 1
IGHOR
@IGHOR Куратор тега Qt
Qt/C++ DEV/CTO
Надо минимизировать количество пере-подключений TCP, создавая каждый раз сокет или QNetworkAccessManager в QRunnable вы делаете переподключение.
QNetworkAccessManager не оптимален для вашей задачи, он преспособлен для загрузки сайтов. В нем по умолчанию есть 4 сокета и используются параллельно для запросов. Советую сделать примитивную реализацию HTTP на QSslSocket/QTcpSocket, чем проще тем лучше.

Сомневаюсь что у вас там 10 тыс камер, так что оптимальный вариант - запустить отдельный QThread для каждого подключения камеры, поддерживать его и доставать изображения с интервалом. Дальше указатель на данные изображения отправлять в накопительный QThread, который будет возвращять json по запросу.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@res2001
Developer, ex-admin
Архитектура от Qt мало зависит.
Если у вас потоки серьезно грузят процессор (на 100%), то смысла заводить потоков больше чем процессорных ядер нет - быстрее уже не будет.
Поэтому делайте очередь и ограниченное количество потоков. Задания складывайте в очередь, а потоки будут сами из нее извлекать задания и обрабатывать.
Для работы с сетью можно попробовать асинхронный ввод/вывод.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы