Главная страница
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.015 c
15-1191534621
Альберт
2007-10-05 01:50
2007.11.11
отмена autorun


6-1172928954
-=Le][=-
2007-03-03 16:35
2007.11.11
HTML текст без тегов используя mshtml.dll


2-1192902797
Jimmy
2007-10-20 21:53
2007.11.11
Изменить цвет отдельных символов Label


1-1187850968
elserpiente
2007-08-23 10:36
2007.11.11
как прочитать version information


2-1192871298
sydenis
2007-10-20 13:08
2007.11.11
как удалить текст из файла?