Вверх ↑
Ответов: 4621
Рейтинг: 746
#1: 2017-05-15 16:41:30 ЛС | профиль | цитата
Galkov писал(а):
Мне даже думается, что попытки изобретательства на эту тему - мало перспективны
Но я то затеял этот разговор, потому что уверен, что решил эту задачу в своих TCP-компонентах и Pipe-компонентах. Надеялся, что выяснятся более подходящие варианты или обнаружатся недостатки.

Видео тестов стабильности Pipe-клиента и сервера: http://rgho.st/private/8SYT74jfT/97414d2c8f51787fc55d1fbf8fdaa1f7
Показывает, как на протяжении 3-х часов к серверу подключаются и отключаются клиенты, отправляют и принимают данные, причём нет никакого аномального потребления памяти и потоков, всё корректно удаляется и отрабатывает.
Сами компоненты с откомпилированными примерами: /topic/66399

Galkov писал(а):
который тоже не хотелось бы исполнять ДО завершения их обоих
Нет ничего сложного - правильно отрабатывать ошибки в THICOMEX.ExecuteRd. Например, мой Pipe-клиент можно элементарно подправить для работы с COM-портом: подправляется метод открытия, метод чтения и метод отправки данных, свойства и события класса. И да, если перед CloseHandle(hFile) выполняется thrd.Stop, то при получении ошибки в THICOMEX.ExecuteRd нужно проверить флаг Stopped - если True, значит нас хотят уничтожить, прекратить работу, не выдавать никаких событий. И да, в моих компонентах как раз используется AutoFree. Но, поскольку у меня не используется WaitFor, чтобы не было дедлоков, то максимально используется механизм подсчета ссылок для класса, который владеет объектом потока TThread - чтобы класс не был уничтожен, пока исполняется его метод в параллельном потоке.

--- Добавлено в 2017-05-15 16:50:36

Galkov писал(а):
поток thrd должен быть убит нафиг и без остатка
Тут не совсем понял - если имеется в виду "убить исполнение метода THICOMEX.ExecuteRd", то выше мы выяснили, что это недопустимо.

--- Добавлено в 2017-05-15 16:58:20

Кстати, в поправке Galkov-a по-моему, неправильно применяется функция WaitForMultipleObjects - нужно делать record с 2-мя полями, в которых будут лежать два Event, и указатель на record передавать в WaitForMultipleObjects.
карма: 26

0
Редактировалось 6 раз(а), последний 2017-05-18 14:22:48