От: | Sshur | http://shurygin-sergey.livejournal.com | |
Дата: | 12.08.10 08:19 | ||
Оценка: |
Главный поток Мастер Надзиратель создает потоки Слушателя Гнезда и Змея Хранителя, затем засыпает, чтобы просыпаться по крику Гнома Оповестителя (таймер на период опроса клиентов).
Поток Слушателя Гнезда- открывает Сокет через Listen (КоличествоКлиентов), и, в цикле крутится с BeginAccept.
Потоки Соединялки, возвращаемые по AcceptCallback — получают рабочий сокет и стартуют потоки Сокетных Трансиверов, возвращая экземпляр Трансивера Мастеру Надзирателю, который кладет его себе на стол (List<Трансивер>)
Сокетный Трансивер получает экземпляр рабочего сокета от Соединялки, получает от клиента через сокет его идентификационный номер и начинает пребывать в ожидании команд Мастера Надзирателя(Через manual reset event)
Мастер надзиратель, проснувшить по крику Гнома Оповестителя, перебирает Трансиверы у себя на столе, и они запрашивают у клиента его координаты
После получения координат от клиентов Трансивер уведомляет Мастера-Надзирателя о координатах (через события, то есть из своего потока)
Мастер Надзиратель, получив координаты от Трансивера, кладет их в хвост Змея-Хранителя
Змей Хранитель, когда просыпается, проверяет наличие у себя в хвосте (List<>) несохраненных данных и сохраняет их. После сохранения всех данных засыпает на некоторое время
В случае ошибки передачи данных поток Сокетного трансивера завершается и он сигнализирует Надзирателю о своей смерти
Мастер Надзиратель, получив оповещение о смерти Трансивера, убирает его со стола
Когда Мастер надзиратель получает от Слушателя Гнезда нового Трансивера, он проверяет наличие трансивера с тем же номером на столе. Если такой находится, он его выкидывает и заменяет новым.