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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Обработка каждого запроса в своём потоке  (Прочитано 4472 раз)
markie
Гость
« : Февраль 07, 2013, 23:32 »

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

Установив соединение, создавайте объекты выполнения (или иначе сказать объекты работы с данными), которые и отправляйте в отдельные потоки. Используйте пул.
Записан
markie
Гость
« Ответ #2 : Февраль 08, 2013, 11:18 »

Вот немного непонятно, как в эти объекты выполнения пропихивать сокет? На сервере в incomingConnection() передаётся в объект дескриптор сокета, а когда QTcpSocket один, то и дескриптор у него один, поэтому всё-таки непонятно как распараллеливать одно соединение.
Записан
alexis031182
Гость
« Ответ #3 : Февраль 08, 2013, 11:24 »

Я бы не запихивал сокеты Qt в потоки. Достаточно того, что они выполняются асинхронно. А вот обработчики прочитанных из сокетов данных как раз в потоках и размещайте.

Если же Вам нужна высокая производительность, то используйте нативные средства работы с сетью по Вашу систему.
Записан
markie
Гость
« Ответ #4 : Февраль 08, 2013, 13:40 »

Но ведь таким образом не получится, например, принимать сразу два больших файла, установив лишь одно соединение, а это требуется.
Записан
alexis031182
Гость
« Ответ #5 : Февраль 08, 2013, 13:43 »

Не очень понял, как это одновременно принимать два файла на одном соединении.
Записан
alexis031182
Гость
« Ответ #6 : Февраль 08, 2013, 13:53 »

Если же речь всё же о последовательном приёме файлов, то их одного за другим в свои объекты выполнения.
Записан
markie
Гость
« Ответ #7 : Февраль 08, 2013, 14:49 »

>Не очень понял, как это одновременно принимать два файла на одном соединении.

По подобию FTP-клиента, там же мы можем параллельно поставить на скачку пару файлов и одновременно производить другие операции. Вот интересует, как это сделать на Qt.
Записан
k0p4
Гость
« Ответ #8 : Февраль 08, 2013, 16:12 »

Цитировать
По подобию FTP-клиента, там же мы можем параллельно поставить на скачку пару файлов и одновременно производить другие операции. Вот интересует, как это сделать на Qt.
Как вариант к каждому чанку дописывать id файла. Но как мне кажется этот вариант достаточно костыльный ибо будут слатся левые данные по сети.
Записан
alexis031182
Гость
« Ответ #9 : Февраль 08, 2013, 18:29 »

По подобию FTP-клиента, там же мы можем параллельно поставить на скачку пару файлов и одновременно производить другие операции. Вот интересует, как это сделать на Qt.
Так это FTP отдельные соединения создаёт. Вы тоже самое можете делать и однопоточно на разных соединения. Будет скачиваться/закачиваться визуально одновременно. Qt сокеты работают ассинхронно, данные передаются небольшими частями, поэтому в большинстве случаев там многопоточность как бы и не особо нужна. Работа непосредственно с сами данными - это да, тут от задачи. А сами приём и передача...
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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