Вверх ↑
Ответов: 4628
Рейтинг: 749
#1: 2015-05-06 18:18:38 ЛС | профиль | цитата
Выложена обновленная версия компонентов

Изменения
1) Более экономное использование параллельных потоков сервером и клиентом
2) Убраны свойства параметров задержки приема, точка Socket
3) Добавлено свойство OverSend
4) Убран 3 пункт из свойства AsyncEvents. Свойство может принимать значения True, False.
Внимание: перед установкой компонентов в существующих схемах, в которых AsyncEvents=All, нужно установить это свойство в значение AsyncEvents=Receive. Либо после установки открыть схему блокнотом и заменить AsyncEvents=2 на AsyncEvents=1. Иначе будет ошибка среды при работе со схемой.
5) В сервере точка CurIPAddress заполняется только на момент событий onClientConnect и onEnumClients
6) onDisconnect происходит также при отключении клиента по doDisconnect/doClose/doCloseAll
7) Полностью переработан внутренний код компонентов, по ходу могли быть исправлены ошибки (или добавлены новые )


Технические подробности

Предыдущие версии использовали следующий подход при работе с соединениями: на каждое входящее подключение сервер создавал один поток для приема данных. При асинхронной отправке для каждого соединения также создавались по одному потоку, отправляющему данные. Если к примеру у сервера есть 500 подключений, то у приложения было запущено 502 потока (на каждое соединение + поток, ожидающий новых подключений, и главный поток).
Если пользователь выполнил бы метод doSendAllAsync, создавалось ещё 500 потоков для отправки. Это был самый простой способ реализации компонентов, но неэффективный.

В новой версии используются менеджеры прослушивания и отправки. Теперь для приема входящих данных создаётся один поток на каждые 64 соединения. Тогда на 6400 соединений будет всего 100 потоков.
Для отправки данных также используется один поток на группу соединений. Максимальное количество потоков отправки жестко задано в коде (в данный момент 5).
Таким образом независимо от количества соединений в сервере методы doSendAllAsync и doSendAsync запустят не более 5 потоков. Небольшой минус - поскольку каждый поток отправляет данные своим соединениям последовательно в цикле, то задержка отправки в одном из соединений затормозит отправку и остальным из данного потока.
Все экземпляры серверов и клиентов в одном приложении пользуются общими потоками приема и отправки.

Кроме того, если раньше потоки создавались на каждую отправку, что было крайне неэффективно, то сейчас поток не останавливается сразу после завершения отправки, а выжидает некоторое время следующих вызовов.

карма: 26

3
Голосовали:flint2, Konst, Net2Com