Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2007.11.11;
Скачать: [xml.tar.bz2];

Вниз

Мой первый 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.45 MB
Время: 0.039 c
15-1191414639
Elen
2007-10-03 16:30
2007.11.11
Несовместимость нового железа и старого софта.


2-1192522073
m-kirill-2003
2007-10-16 12:07
2007.11.11
Delphi и Mysql


8-1169318785
mary84
2007-01-20 21:46
2007.11.11
как создать в базе данных таблицу картинок jpg


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


15-1190797843
Ega23
2007-09-26 13:10
2007.11.11
Бесплатная Embedded-СУБД





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский