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

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

Страниц: 1 2 [3]   Вниз
  Печать  
Автор Тема: Два потока работают с QQueue  (Прочитано 27229 раз)
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #30 : Октябрь 24, 2014, 22:10 »

В целом - да. Но сетевой поток в общем случае тоже не один - там пул потоков (клиентов может быть до 256 шт).
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #31 : Октябрь 24, 2014, 22:32 »

В целом - да. Но сетевой поток в общем случае тоже не один - там пул потоков (клиентов может быть до 256 шт).
Посылка сигнала между потоками сводится к помещению события в Qt-шную очередь сообщений. Вам без очереди все равно не обойтись, поэтому пока не вижу серьезных причин отказываться от Qt-шной. В будущем, при необходимости, вы всегда сможете сделать свою специальную очередь для этого. Но без дополнительных тестов, показывающих что тормозит именно она, я бы пока не дергался.
А вот как раскидываются задачи на отправку между потоками сендерами? Или у вас по потоку на клиента и всем передаются одинаковые данные?
И как вы определили, что "в кому" впадает именно при отправке сигнала?

/* И выбор Qt для решения этой задачи удивляет. Не очень понятно для чего он здесь. Ну это риторический вопрос. Улыбающийся */
« Последнее редактирование: Октябрь 24, 2014, 22:54 от Old » Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #32 : Октябрь 25, 2014, 11:08 »

Посылка сигнала между потоками сводится к помещению события в Qt-шную очередь сообщений. Вам без очереди все равно не обойтись, поэтому пока не вижу серьезных причин отказываться от Qt-шной. В будущем, при необходимости, вы всегда сможете сделать свою специальную очередь для этого. Но без дополнительных тестов, показывающих что тормозит именно она, я бы пока не дергался.
С этим-то всё ясно, об этом-то сейчас и думаю. В том числе и в этом топике Улыбающийся

А вот как раскидываются задачи на отправку между потоками сендерами? Или у вас по потоку на клиента и всем передаются одинаковые
данные?
Нет, на клиента не по потоку. Сетевые клиенты собраны в пулы, каждый пул обрабатывает один поток. Количество таких пулов пока задается вручную при старте сервера. Трафик, постоянно и равномерно отправляемый на клиента, составляет: в худшем случае 1 МБ/с, в среднем -  256 кБ/с.

И как вы определили, что "в кому" впадает именно при отправке сигнала?
Периодически удаётся "попасть" на это место при запуске сервера из-под отладчика. Последнее разумное место в стеке до AV это как раз вызов сигнала. Но, повторюсь, вопрос до конца не исследован, может это не причина, а следствие.

/* И выбор Qt для решения этой задачи удивляет. Не очень понятно для чего он здесь. Ну это риторический вопрос. Улыбающийся */
Не менее риторический ответ - по историческим причинам Улыбающийся. Фоново уже думаю о том, чтобы уйти в что-нибудь менее тяжёлое типа libuv или asio. Может ещё ZeroMQ. Но, там много всяких плюшек от Qt используется типа соединения с БД, логирование, сеть, QSettings, плагины, QSingleApplication и т.п. Не хотелось бы всё это заменять на набор разнородных костылей. В любом случае, делать это только ради того, чтобы гордо сказать, что у "меня на сервере нет Qt" не будем Улыбающийся.
А вот "со своей специальной очередью" - думаем.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #33 : Октябрь 25, 2014, 14:45 »

Развил здесь
Мда, запас прочности Qt намного больше чем я предполагал  Улыбающийся
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #34 : Октябрь 25, 2014, 15:37 »

Нет, на клиента не по потоку. Сетевые клиенты собраны в пулы, каждый пул обрабатывает один поток. Количество таких пулов пока задается вручную при старте сервера. Трафик, постоянно и равномерно отправляемый на клиента, составляет: в худшем случае 1 МБ/с, в среднем -  256 кБ/с.
Все равно не очень понятно. Все клиенты получают одинаковые данные. А отправкой данных занимается одна нить на несколько клиентов?
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #35 : Октябрь 25, 2014, 16:15 »

Все клиенты получают разные данные. Вернее могут получать и одинаковые, но это частный случай. Ридеры читают разные места из кольцевого буфера - клиентам уходят разные данные. И - да, отправкой данных занимается одна нить на несколько клиентов. Считайте, что это большой архив системы видеонаблюдения. Клиент "смотрит" тот участок видео, какой ему понадобится, и с той скоростью, какую может позволить себе сервер или с какой может "справиться" сам клиент.
« Последнее редактирование: Октябрь 25, 2014, 20:59 от xokc » Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #36 : Ноябрь 29, 2014, 23:14 »

И как вы определили, что "в кому" впадает именно при отправке сигнала?
Кстати, таки определили из-за чего оно валится. У нас в приложении в каждом из потоков-читателей открыт один и тот-же файл, из которого и производится весьма интенсивное чтение блоками по 188 кБайт через QFile::read. Так вот, если QFile открыт без опции QIODevice::Unbuffered, то на уровне Qt производится кеширование, снимающее проблему низкой производительности при чтении из файла мелким порциями. И в нашем случае оно работает криво, т.е. приводит к регулярному AV. Так что проблема решилась добавлением к флагам при открытии файла QIODevice::Unbuffered.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #37 : Ноябрь 29, 2014, 23:19 »

Так а что значит: в вашем случае работало кривой?
В чем кривизна?
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #38 : Ноябрь 30, 2014, 00:09 »

Вываливалось в access violation внутри QFile::read. Подебажил исходники - внутри read если не включен QIODevice::Unbuffered производится кеширование через внутренний QByteArray. Дальше разбираться не стал - добавил QIODevice::Unbuffered в QFile::open и всё заработало нормально. В нашей задаче даже кеш ОС отключить стоило-бы, так что лишние "оптимизации" тут со стороны Qt нам ни к чему.
Записан
Страниц: 1 2 [3]   Вверх
  Печать  
 
Перейти в:  


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