Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.11.11;
Скачать: CL | DM;

Вниз

Мой первый 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;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.018 c
6-1173451478
K@KTUS
2007-03-09 17:44
2007.11.11
Компоненты FastNet


15-1191250150
Andy BitOff
2007-10-01 18:49
2007.11.11
Запрос SQL. Создание, оптимизация.


2-1192591433
balepa
2007-10-17 07:23
2007.11.11
Access Violation or Invalide Pointer operation


15-1191242767
REA
2007-10-01 16:46
2007.11.11
Прорисовка компонента Explorer Search bar


4-1178440852
buben
2007-05-06 12:40
2007.11.11
Как скрыть форму чужого приложения