![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Мой первый application hangs (Indy) [D7, WinXP]
Empleado © (2007-03-09 18:21:00)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 решений.
Спасибо.
Сергей М. (2007-03-12 09:11:00) [1]Обработчик TIdTCPServer.OnDisconnect выполняется НЕ в основном потоке, поэтому обращение к VCL-контролу (в твоем случае - RichEdit) там НЕ допустимо.
Empleado (2007-03-09 20:31:00) [2]
> OSA © (09.03.07 19:08) [1]
> Пишу все логи в TStringList.
Угу. Есть такое.
Про этот вариант читал в "Глубины INDY" (стр. 76).
OSA (2007-03-09 19:08:00) [3]Я юзаю Indy 9.
Пишу все логи в TStringList.
А таймер, находящийся в основном потоке, все это дело пишет в Memo.
В таймере юзаю критическую секцию.
Считаю это лучшим решением.