destructor THITCP_Server.Destroy;
begin
Sock.Close; // это добавлено для закрытия при уничтожении
Sock.OnConnect := nil;
Sock.OnDisconnect := nil;
Sock.OnRead := nil;
Sock.OnClientConnect := nil;
Sock.OnClientDisconnect := nil;
//Sock.Destroy;
inherited;
end;
Этот топик читают: Гость
Разработчик
Ответов: 26163
Рейтинг: 2127
|
|||
Используя компонент TCP_Server в мультике, я заметил, что при уничтожении мультика по ##clear, и повторном создании мультика по ##add, сокет не работает, так как не закрывается при уничтожении компонента. Немного подправив код мне удалось убрать этот баг, и сокет стал нормально открываться при пересоздании мультика
|
|||
карма: 22 |
|
Ответов: 5446
Рейтинг: 323
|
|||
nesco, а можно вопрос: почему не работало по Destroy? Ибо TCP.pas гласит:
|
|||
карма: 1 |
|
Разработчик
Ответов: 26163
Рейтинг: 2127
|
|||
iarspider, сейчас попробую нарисовать простенький пример и проверить еще раз.
[size=-2]------ Добавлено в 11:23 Вот пример MultiTCP_Servera на два сокета Последовательность тестирования: 1. По Add создаем MultiServer 2. По Connect подключаемся к серверу 3. Видим информацию подключения в окнах клиентов. 4. Пробуем отключить сервер по Clear, должна в окнах клиентов пропасть информация, но она не пропадает. 5. Нажимаем Disconnect вручную, очищая окна клиентов. 6. Повторяем пункты 1 и 2. 7. В окнах клиентов не появляется ничего. 8. Вносим предложенное исправление в hiTCP_Server.pas. 9. Запускаем и повторяем операции с пункта 1 по пункт 4 -- в окнах клиентов пропадает информация, значит по Clear нормально происходит отсоединение. 10. Пробуем повторить пункты 1 и 2 11. Видим информацию в окнах клиентов. Значит произошло нормальное пересоздание сервера. [size=-2]------ Добавлено в 12:46 Ну и какие будут предложения по этой теме? [size=-2]------ Добавлено в 12:50 Выкладываю в обычном формате code_1867.txt [size=-2]------ Добавлено в 23:49 Странно, но народ молчит. Можно, конечно, повесить очистку на предсмертный цикл перед ##clear, но это добавит несколько компонентов, и неправильно это как-то, на маразм смахивает. tsdima, вроде ты специалист по сокетам, что скажешь? |
|||
карма: 22 |
| ||
файлы: 1 | code_1867.txt [3.4KB] [311] |
Гость
Ответов: 17029
Рейтинг: 0
|
|||
Редактировалось 2 раз(а), последний 2021-05-22 08:22:23 |
|||
карма: 0 |
|
Разработчик
Ответов: 26163
Рейтинг: 2127
|
|||
tsdima, тут похоже на неправильное отрабатыание destructorov. Может Galkov чего подскажет.
|
|||
карма: 22 |
|
Ответов: 2125
Рейтинг: 159
|
|||
Не, по другому, оказывается, нажималось: Add, Add, Close
Чувствуешь, чем пахнет? Дважды Add нельзя. [size=-2]------ Добавлено в 22:06 Я даже нашёл почему. Вот как надо:
|
|||
карма: 1 |
|
Разработчик
Ответов: 26163
Рейтинг: 2127
|
|||
tsdima, но в Sock.Destroy вызывается тот же самый Close и больше ничего. И смысл тогда к нему обращаться, если можно напрямую вызвать Sock.Close?
tsdima писал(а): С точки зрения программирования, если Sock создали
[size=-2]------ Добавлено в 22:14 tsdima, и куда воткнуть, что ты написал? |
|||
карма: 22 |
|
Ответов: 2125
Рейтинг: 159
|
|||
Sock.Create создал объект типа TSocket,
Sock.Destroy его уничтожил. За собой надо убирать, иначе никакая динамическая чистота у нас не получится. [size=-2]------ Добавлено в 22:17 Там вроде только в одном месте Listen |
|||
карма: 1 |
|
Разработчик
Ответов: 26163
Рейтинг: 2127
|
|||
tsdima писал(а): За собой надо убирать, иначе никакая динамическая чистота у нас не получитсяда, я понял. А то мы все про сокеты, вот я про класс и забыл. Лучше, конечно, поправить на SVN, чтобы у других вопросов не возникало. |
|||
карма: 22 |
|
Ответов: 2125
Рейтинг: 159
|
|||
Поправил на SVN
|
|||
карма: 1 |
|
Разработчик
Ответов: 26163
Рейтинг: 2127
|
|||
Поправил, проверил, вроде работает. Похоже, еще одна задача решена.
[size=-2]------ Добавлено в 22:55 tsdima, опять компилятор на onError ругается , придется самому дочищать. |
|||
карма: 22 |
|
11