Главная страница
    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.45 MB
Время: 0.043 c
15-1191866338
DeadLord
2007-10-08 21:58
2007.11.11
странное поведение StringGrid


9-1162828267
Алена
2006-11-06 18:51
2007.11.11
OpenGl


2-1192771946
dumka
2007-10-19 09:32
2007.11.11
Подстановочное поле.


6-1165172528
Yegorchic
2006-12-03 22:02
2007.11.11
Перехват запуска соединение по dial-up


4-1178288430
kain2
2007-05-04 18:20
2007.11.11
Помогите ошибка!!!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский