Russian Qt Forum

Qt => Работа с сетью => Тема начата: markie от Февраль 07, 2013, 23:32



Название: Обработка каждого запроса в своём потоке
Отправлено: markie от Февраль 07, 2013, 23:32
Всем привет! Интересует такой вопрос: каким лучше образом обрабатывать определённые запросы клиента в отдельном потоке?
Сейчас у меня обрабатывается каждое соединение в отдельном потоке (переопределение incomingConnection() у QTcpServer), но нужна также и параллельная обработка нескольких запросов от одного клиента.
Первое, что приходит в голову - по приходу сигнала readyRead() вызывать у QTcpSocket'a setParent(0) и передавать его с помощью moveToThread в отдельный поток, но мне кажется такая реализация немного грубой.
Может у кого-нибудь есть какие-нибудь более интересные решения? Заранее спасибо!


Название: Re: Обработка каждого запроса в своём потоке
Отправлено: alexis031182 от Февраль 07, 2013, 23:41
Установив соединение, создавайте объекты выполнения (или иначе сказать объекты работы с данными), которые и отправляйте в отдельные потоки. Используйте пул.


Название: Re: Обработка каждого запроса в своём потоке
Отправлено: markie от Февраль 08, 2013, 11:18
Вот немного непонятно, как в эти объекты выполнения пропихивать сокет? На сервере в incomingConnection() передаётся в объект дескриптор сокета, а когда QTcpSocket один, то и дескриптор у него один, поэтому всё-таки непонятно как распараллеливать одно соединение.


Название: Re: Обработка каждого запроса в своём потоке
Отправлено: alexis031182 от Февраль 08, 2013, 11:24
Я бы не запихивал сокеты Qt в потоки. Достаточно того, что они выполняются асинхронно. А вот обработчики прочитанных из сокетов данных как раз в потоках и размещайте.

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


Название: Re: Обработка каждого запроса в своём потоке
Отправлено: markie от Февраль 08, 2013, 13:40
Но ведь таким образом не получится, например, принимать сразу два больших файла, установив лишь одно соединение, а это требуется.


Название: Re: Обработка каждого запроса в своём потоке
Отправлено: alexis031182 от Февраль 08, 2013, 13:43
Не очень понял, как это одновременно принимать два файла на одном соединении.


Название: Re: Обработка каждого запроса в своём потоке
Отправлено: alexis031182 от Февраль 08, 2013, 13:53
Если же речь всё же о последовательном приёме файлов, то их одного за другим в свои объекты выполнения.


Название: Re: Обработка каждого запроса в своём потоке
Отправлено: markie от Февраль 08, 2013, 14:49
>Не очень понял, как это одновременно принимать два файла на одном соединении.

По подобию FTP-клиента, там же мы можем параллельно поставить на скачку пару файлов и одновременно производить другие операции. Вот интересует, как это сделать на Qt.


Название: Re: Обработка каждого запроса в своём потоке
Отправлено: k0p4 от Февраль 08, 2013, 16:12
Цитировать
По подобию FTP-клиента, там же мы можем параллельно поставить на скачку пару файлов и одновременно производить другие операции. Вот интересует, как это сделать на Qt.
Как вариант к каждому чанку дописывать id файла. Но как мне кажется этот вариант достаточно костыльный ибо будут слатся левые данные по сети.


Название: Re: Обработка каждого запроса в своём потоке
Отправлено: alexis031182 от Февраль 08, 2013, 18:29
По подобию FTP-клиента, там же мы можем параллельно поставить на скачку пару файлов и одновременно производить другие операции. Вот интересует, как это сделать на Qt.
Так это FTP отдельные соединения создаёт. Вы тоже самое можете делать и однопоточно на разных соединения. Будет скачиваться/закачиваться визуально одновременно. Qt сокеты работают ассинхронно, данные передаются небольшими частями, поэтому в большинстве случаев там многопоточность как бы и не особо нужна. Работа непосредственно с сами данными - это да, тут от задачи. А сами приём и передача...