Форум: "Сети";
Текущий архив: 2007.11.11;
Скачать: [xml.tar.bz2];
ВнизМой первый application hangs (Indy) Найти похожие ветки
← →
Empleado © (2007-03-09 18:21) [0]Indy - v.10.1.5; Dephi7
Продолжаю введение меня в суть чистописания прикладных программ, используя сокеты.
Простенькая программа-тест.
Форма; на форме - ТIdTCPServer, TRichEdit (лог), 2 х TButton (старт сервер и стоп сервер).
Сюжет:
Обнаружил, что если из ТIdTCPServer.OnDisconnect записывать в лог текстовые сообщения (reLog.Lines.Append("OK. Клиент xxx отчалил")), то в случае, когда нажимаем на кнопку "Стоп сервер" и останавливаем сервер (IdTCPServer.Active := False) с открытыми клиентскими соединениями, - приложение замораживается.
Если правильно понимаю, то главный поток приложения ждет остановки сервера IdTCPServer, который ждет завершения потока клиентского соединения, а тот, в свою очередь, ждет, когда главный поток обработает его пост в лог. (или что-то в этом роде, фиг его знает...)
Мое решение:
Надумал разрешить такую ситуацию следующим образом:
Создаю список данных каждого соединения (TConnectionsListInfo).
При каждом новом соединении, добавляю в список нового члена и параметры соединения.
В обравотчике IdTCPServer.OnDisconnect отправляю юзер-сообщение главной форме (PostMessage) об отключении клиента с указателем на данного клиента в списке.
В форме отлавливаю сообщение и обрабатываю его.
Такое работает, но все (мне так кажется) как-то через за....у. Поэтому
Вопрос:
Нет ли другого способа, проще/прямее обойти подобное зацикливание? И как?
ПС. Знаю, что можно послать инфу в лог из другого места выполняемого кода (не из OnDisconnect), но цель - разобраться в этой проблеме и найти множество ee решений.
Спасибо.
← →
OSA © (2007-03-09 19:08) [1]Я юзаю Indy 9.
Пишу все логи в TStringList.
А таймер, находящийся в основном потоке, все это дело пишет в Memo.
В таймере юзаю критическую секцию.
Считаю это лучшим решением.
← →
Empleado © (2007-03-09 20:31) [2]
> OSA © (09.03.07 19:08) [1]
> Пишу все логи в TStringList.
Угу. Есть такое.
Про этот вариант читал в "Глубины INDY" (стр. 76).
← →
Сергей М. © (2007-03-12 09:11) [3]Обработчик TIdTCPServer.OnDisconnect выполняется НЕ в основном потоке, поэтому обращение к VCL-контролу (в твоем случае - RichEdit) там НЕ допустимо.
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2007.11.11;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.039 c