QThread, QEvent, QTcpServer, взаимодействия между потоками |
Здравствуйте, гость ( Вход | Регистрация )
QThread, QEvent, QTcpServer, взаимодействия между потоками |
512es |
10.11.2008, 16:00
Сообщение
#1
|
Участник Группа: Участник Сообщений: 135 Регистрация: 31.10.2008 Пользователь №: 407 Спасибо сказали: 5 раз(а) Репутация: 0 |
всем привет!
пишу многопоточный высокопроизводительный сервер на qt. сервер прослушивает коннекты на определённый порт и на каждое входящее соединение создаёт отдельный поток. при каждом пришедшем пакете поток отсылает главному потоку сообщение через customEvent. вроде работает, только не знаю как правильнее заставить все дочерние потоки (или один выборочно) отослать определённый пакет клиентам? закинул все потоки массив QVector и передаю в customEvent главного потока ид того кто отправил. правильный путь ли я выбрал? |
|
|
ViGOur |
11.11.2008, 0:19
Сообщение
#2
|
Мастер Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: 40 |
но вроде слот выполняется там, где его собственный объект. В том потоке в котором был создан объект получатель.дабы не вешать главный поток при ддос атаках. Тогда тебе нужно отказаться от схемы "1 соединени - 1 поток", а подумать о реализации схему "много соединений - 1 поток". Например в винде можно обрабатывать в одном потоке 64 соединения, в никсах не знаю сколько, но думаю, что не меньше...Да и то это поможет при маленьком DDOS'ике, при серьезном, когда порядка 100 000 соединений к тебе идет у тебя тупо не хватит ресурсов для обработки. Что-то ты зациклился на ID соединений, чем тебе не нравится указатель на соединение? Что ID 4 байта, что указатель 4 байта, только с указателем нужно меньше телодвижений чем с ID. Список соединений тебе скорее всего понадобится, иначе где класс менеджер соединений будет хранит указатели на соединения? Класс менеджер соединений должен быть синглтоном, надеюсь не нужно объяснять почему. При установке соединений сервер создает указатель на него, который помещает в менеджер соединений. При закрытии соединения посылается сигнал менеджеру соединений для того, чтобы он удалил из списка данное соединение, и если соединение было последним в потоке, то завершать поток (в это случае нужно предусмотреть на нагруженном сервере пул потоков, чтобы не тратить системные ресурсы на создание новых потоков). И прочее... |
|
|
Текстовая версия | Сейчас: 26.12.2024, 13:41 |