Здравствуйте, форумчане

Пишу многопоточный сервер в Delphi. Работает, как сервис(TService).
при инициализации TService, создаётся "серверный" объект TThread, в котором идёт приём подключений.
При каждом подключении и проверке его на допустимый адрес, создаётся "клиентский" объект TThread.
в свойства этого объекта передаются все необходимые для его работы значения (как то дескриптор сокета,
адресная структура и т.д.). и этот объект уже самостоятельно работает с ОДНИМ клиентским подключением,
обрабатывает пакеты, высылает ответы и т.д.
помимо этого, у "серверного" объекта TThread есть динамический массив этих самых "клиентских" объектов —
подключений.
необходимо это для того, чтобы при завершении работы TService, например, поочерёдно остановить все эти
"клиентские" TThread, затем "серверный" TThread и уничтожить все объекты.
Вопрос в следующем:
Клиентское подключение может внезапно завершиться с ошибкой, клиент может самостоятельно отключиться.
"клиентская" нить прекращает работу, но для сервера, она — всё ещё "активное" подключение и находится в
динамическом массиве. Т.е. возникает необходимость в — как бы — менеджере нитей, который будет
периодически — ОТ ЛИЦА СЕРВЕРА — добивать уже неработающие клиентские TThread'ы, "подчищать" свой динам.
массив "клиентских" TThread'ов.
но мне не нравится слово "периодически" — как-то не этично чтоли
и интересует: как, вообще, делается организация таких вещей? какие идеи вы можете посоветовать?
алсо, не прошу готового кода или чего-то такого. просто сталкиваюсь с этим — фактически — впервые.
поэтому прошу братского совета! ^^ заранее, спасибо.
Здравствуйте, Joffa, Вы писали:
J>Здравствуйте, форумчане
J>Пишу многопоточный сервер в Delphi. Работает, как сервис(TService).
ну вы готовую конструкцию используете — смотрите сам компонент — его свойства и методы, вообщем эт скорее по делфям тема
Здравствуйте, Joffa, Вы писали:
J>Здравствуйте, форумчане
J>помимо этого, у "серверного" объекта TThread есть динамический массив этих самых "клиентских" объектов —
J>подключений.
Динамический массив-то зачем?
J>необходимо это для того, чтобы при завершении работы TService, например, поочерёдно остановить все эти
J>"клиентские" TThread, затем "серверный" TThread и уничтожить все объекты.
клиентский поток перед выходом (в finally секции, желательно) вызывает папу на предмет вынимания себя из списка
естественно, операции со списком надо оборачивать в критическую секцию
только я не использую дин массивы, у меня тупо сортированный TStringList ,
каждому вновь созданному клиенту назначается GUID, он, заодно, и ключ в списке для быстрого поиска себя и удаления