Форум: "Сети";
Текущий архив: 2006.12.17;
Скачать: [xml.tar.bz2];
ВнизКорректно и абсолютно закрыть ИНДИ сервер Найти похожие ветки
← →
Kacnep © (2006-07-24 13:18) [0]Ув. Мастера, работает некий инди сервер.
К нему за время работы подключались отключались некие клиенты.
Теперь мне нужно по закрытию программы сначала корректно закрыть инди сервер
ИНДИСервер.Active:=false;
Зависает и не отрабатывает.
Дальше программа должна завершить свою работу.
Вот конкретный проект закрытия
http://delphimaster.net/view/6-1153725024/
Может у кого нить из Мастеров есть пример как они в своих приложениях завершают работу своих программ?
← →
Reindeer Moss Eater © (2006-07-24 13:20) [1]Все, что нужно сделать - прервать выполняющиеся синхронные методы чтения/записи. Смотри в сторону таймаутов.
← →
Kacnep © (2006-07-24 13:21) [2]Забыл добавить.
Если у кого есть желание пообщаться напрямую ОНЛАЙН
добро пожаловать ICQ 70015922
← →
Kacnep © (2006-07-24 13:23) [3]2 Reindeer Moss Eater
Так какое может быть чтение если команда на сервер пришла - он отправил ответ и ждет?
Вроде бы после каждого такого сеанса команда ответ - отправлялся дисконнект на клиента. Т.е. вроде бы соединений быть не дОлжно!
Ничего не понимаю :((
← →
Reindeer Moss Eater © (2006-07-24 13:41) [4]он отправил ответ и ждет?
Ждет-то читая наверное?
← →
Каспер (2006-07-24 18:28) [5]ЛЮЮЮДИ сос!!!
Это уже истерика!
Не обязательно спецы! ВСЕ! Кто что либо когда либо писл на ИНДИ?!
Скажите как вы закрывали Инди сервер? ОН ВИСИТ!!! Если никто никогдда не цеплялся к серверу то Актив=фалсе работает на ура! Если хоть раз кто нить зацепился -все! Висяк!
Кто нить что нить может сказать по поводу?
Неужели у вас никогда не возникала такая ситуация?
Приведите пример своих завершений ИНДИ!
ПЛИИЗ!
Почти 12 часов рыл. Бесполезно!
← →
Reindeer Moss Eater © (2006-07-24 18:35) [6]Тебе все уже сказано.
У тебя используются CommandHadler"ы.
Это значит, что сервер все свое "свободное" время читает клиента и прочитав данные парсит их, ища сами команды.
Методы чтения - синхронные.
Вот они-то и виноваты в твоих висяках.
← →
umbra © (2006-07-24 19:51) [7]а сервер после получения команды shutdown отключает клиента, который эту команду прислал?
← →
Каспер (2006-07-24 21:26) [8]2 umbra © (24.07.06 19:51) [7]
Да! Отключает! Двумя вариантами пробовал.
Если команду выполняет -у нее есть свойство - после прихода дисконнект -это в свойстве есть.
И второй вариант принудительно сам дисконектил - пофиг :((.
Посмотри ссылку на другой мой вопрос. в этом топике она в первом посте.
Там подробный код отключения моего :(.
2 Reindeer Moss Eater
У меня приходит только одна комманда! Т.е. он все время слушает! Так как его загасить?
Плиз! Кусок кода? Хоть что нить! Посмотри на время - скоро сутки как я пытаюсь определить как отрубить ЭТО?!
Плииз!
2 ОЛЛЛ!!
ЛЮДИ ну киньте не пожадничайте свои версии гашения ИНДИ серверов!
:((
Спасибо
← →
Slym © (2006-07-25 06:16) [9]Server.Free;
← →
Kacnep © (2006-07-25 06:30) [10]После этого поновой придется создавать экземпляр ИНДИ сервера :((
← →
Slym © (2006-07-25 06:43) [11]Kacnep © (25.07.06 6:30) [10]
Зачем? Ты же всеравно Application.Terminate;
← →
Kacnep © (2006-07-25 06:47) [12]Ну если ТАК отталкиваться то ХАЛЬТ и все :)))
Но ведь это не корректно!!!! :((
Самое интересное что мало народа отвечает - а ведь инди используется многими и неужели такого вопроса не вставало?
Скажем по нажатию кнопки отключить инди сервер и по закрытию программы сначала отключить сервер а потом уже ее закрыть :(((.
Если к серверу не коннектиься народ то гаситься все на ура - если были подключения - И ДАЖЕ НОРМАЛЬНО дисконнектились - ВСЕ!
ИНДИСервер.Active:=false;
ТУПО ВИСНЕТ!
Ни эксепшена - ни чего! Код который идет потом не выполняется!
← →
Kacnep © (2006-07-25 07:41) [13]После полутора суток диких экспрементов и прочтения всего круглого стола программа заработала.
Был сделан вывод
1. Перед гашением ИНДИсервера - отключать ВСЕ соединения
2. После отключения каждого соединения ждать - убеждаться что оно завершено!!! - это получилось тупым СЛИПОМ(2000)
А вот первое в Инди 10 так и не нашел.
В общем корявенькое такое решение. :(
← →
Reindeer Moss Eater © (2006-07-25 08:26) [14]У меня приходит только одна комманда! Т.е. он все время слушает! Так как его загасить?
Какая разница сколько приходит команд?
Каждая нить твоего сервера постоянно пытается читать клиентское соединение чтобы преподнести на блюдечке тебе событие.
Вот и вся причина.
← →
Kacnep © (2006-07-25 08:51) [15]Возможно.
Но когда я сказал обрубиться нити - будь так добра!
Сейчас обработчик гашения выглядимт так.
1 Приходит коанда
2 Устанавливаеться параметр МАСТШатдаун
3 Дисконектиться пользователь приславший команду
4 На собитии дисконекта пользователя -Если установлена команда МАСТШатдаун - Закрывать приложение
5 Жду 2 сек
6 На событии ЗапросЗакрытия Гашу сервер
7 Закрываю приложение
Вот так все работает :(
← →
Reindeer Moss Eater © (2006-07-25 08:55) [16]А кому интересен твой флаг, если первичное чтение клиента организовано не тобой, а кодом самого сервера? Никому.
← →
Kacnep © (2006-07-25 10:27) [17]Ну... флаг - команды разные могут приходить и юзеры так же могут отключаться... и не при каждом их отключении сервер должен гаситься
← →
umbra © (2006-07-25 10:48) [18]а нужно ли сохранять соединение с клиентом, приславшим команду? Если нет, то не лучше ли сразу отключать его в обработчике?
procedure TForm1.IdCmdTCPServer1CommandHandlers0Command(
ASender: TIdCommand);
begin
{...............................}
ASender.Context.Connection.Disconnect;
{.......................................}
end;
← →
Reindeer Moss Eater © (2006-07-25 11:59) [19]Ну... флаг - команды разные могут приходить и юзеры так же могут отключаться... и не при каждом их отключении сервер должен гаситься
Флаг для кого? Для своего кода. Так как только твой код этот флаг анализирует.
А проблема в чем? забыл?
В синхронно выполняющемся методе чтения, который написан не тобой и которому на флаг твой - с высокой колокольни.
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2006.12.17;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.042 c