Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.014 c
2-1192601466
031178
2007-10-17 10:11
2007.11.11
Работа с файлами


11-1177182170
Rusya
2007-04-21 23:02
2007.11.11
Сделать CenterOnParent


15-1191265598
TopoR
2007-10-01 23:06
2007.11.11
2 задачи в Delphi...


2-1192561443
smartleds
2007-10-16 23:04
2007.11.11
Коллеги, подскажите как найти максимальный номер элемента


15-1191917559
БарЛог
2007-10-09 12:12
2007.11.11
Direct Connect - сервер




   Наверх