powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TIdUDPClient: прервать ожидание
22 сообщений из 22, страница 1 из 1
TIdUDPClient: прервать ожидание
    #39963143
misha mike
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет.

Ситуация вроде самая стандартная. Есть TIdUDPClient, есть читающий поток, который в цикле вызывает ReceiveBuffer(). Таймаут ожидания бесконечный (это важно), то есть пока нет данных, читающий поток в перманентном ожидании.

Вопрос на засыпку: как из основного потока сделать так, чтобы прервать работу ReceiveBuffer() и дать читающему потоку корректно завершиться?

Просто закрыть сокет -- не вариант по двум веским причинам (если кому интересно, объясню).
...
Рейтинг: 0 / 0
TIdUDPClient: прервать ожидание
    #39963159
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А почему нельзя использовать TIdUdpServer?
...
Рейтинг: 0 / 0
TIdUDPClient: прервать ожидание
    #39963181
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
misha mike
Таймаут ожидания бесконечный (это важно), то есть пока нет данных, читающий поток в перманентном ожидании.

Вопрос на засыпку: как из основного потока сделать так, чтобы прервать работу ReceiveBuffer() и дать читающему потоку корректно завершиться?

Ответ очевиден. Ожидать не "бесконечно".
...
Рейтинг: 0 / 0
TIdUDPClient: прервать ожидание
    #39963270
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
misha mikeкак из основного потока сделать так, чтобы прервать работу ReceiveBuffer() и дать
читающему потоку корректно завершиться?

Естественный ответ: послать ему UDP пакет "завершись!".

misha mikeПросто закрыть сокет -- не вариант по двум веским причинам (если кому интересно, объясню).

Я подозреваю, что эти две причины не имеют ничего общего с главной и единственной:
закрытие сокета не обязано прерывать ожидание. Хотя на Windows и делает это.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
TIdUDPClient: прервать ожидание
    #39963287
misha mike
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer
А почему нельзя использовать TIdUdpServer?

Может, потому что нужен именно клиент?

wadman
Ответ очевиден. Ожидать не "бесконечно".

Нихрена он не очевиден. И даже вреден. Не думал что тут придется объяснять, почему.

Dimitry Sibiryakov
Естественный ответ: послать ему UDP пакет "завершись!".

Легально послать такой пакет может только сервер, а он ни сном ни духом, что клиент хочет отключиться.

Я подозреваю, что эти две причины не имеют ничего общего с главной и единственной:
закрытие сокета не обязано прерывать ожидание. Хотя на Windows и делает это.
Это одна из причин. А другая в том, что код Indy так написан, что даже если прервать ожидание закрытием, сокет тут же пересоздается.
...
Рейтинг: 0 / 0
TIdUDPClient: прервать ожидание
    #39963296
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
misha mikeЛегально послать такой пакет может только сервер

"Чо?" UDP пакет может послать любой. Это всего лишь вызов одной-единственной функции sendto().
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
TIdUDPClient: прервать ожидание
    #39963320
misha mike
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

"Чо?" UDP пакет может послать любой. Это всего лишь вызов одной-единственной функции sendto().

Да, таки работает. Просто не думал, что сокет может так просто самому себе отослать байт. Есть некоторые сложности с биндингом на конкретный адаптер, но это решаемо. Спасибо!
...
Рейтинг: 0 / 0
TIdUDPClient: прервать ожидание
    #39963326
Zelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
misha mike,

не понял, почему важно бесконечное ожидание? что мешает ждать с таймаутом 1 сек и проверять флаг прерывания? если не установлен, то опять ждем... максимум будет задержка 1 сек на прерывание потока
...
Рейтинг: 0 / 0
TIdUDPClient: прервать ожидание
    #39963376
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
misha mike
Не думал что тут придется объяснять, почему.

Ждем откровений.
...
Рейтинг: 0 / 0
TIdUDPClient: прервать ожидание
    #39963540
misha mike
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zelius
не понял, почему важно бесконечное ожидание? что мешает ждать с таймаутом 1 сек и проверять флаг прерывания? если не установлен, то опять ждем... максимум будет задержка 1 сек на прерывание потока

Именно это и мешает. С таким подходом я не могу прибить поток (вместе со всем, что на него завязано) тогда, когда мне это нужно. Вместо этого приходится ждать до истечения таймаута, пока поток просрется очнется и будет готов завершиться.

А уменьшение таймаута увеличивает паразитную нагрузку на процессор, и в моем случае его пришлось бы уменьшить до 10 мс, что вообще ни в какие ворота.

И да, не нужно забывать про принцип " никогда ничего не опрашивай " (есть перевод от Гансмокера).
...
Рейтинг: 0 / 0
TIdUDPClient: прервать ожидание
    #39963563
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
misha mike
А уменьшение таймаута увеличивает паразитную нагрузку на процессор, и в моем случае его пришлось бы уменьшить до 10 мс, что вообще ни в какие ворота.

Страхов так и не нашлось, кроме выдуманных. 100 мс - тоже норм для прерывания, если только не связано с жестким ограничением протоколов при работе с железками. Но даже у еле живых процессоров с их протоколами обычно задержки от 200 мс считаются поводом для паники. Реже меньше 100.

Инди - не лучший выбор для критически важных данных. Я-бы свое написал с overlapped io (лет 10 назад), либо взял ICS (сейчас).
Там эта "проблема" решена изначально, точнее - не создана. Бонусом нормальная поддержка многопоточности.
...
Рейтинг: 0 / 0
TIdUDPClient: прервать ожидание
    #39963584
misha mike
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman
Страхов так и не нашлось, кроме выдуманных. 100 мс - тоже норм для прерывания, если только не связано с жестким ограничением протоколов при работе с железками. Но даже у еле живых процессоров с их протоколами обычно задержки от 200 мс считаются поводом для паники. Реже меньше 100.

Я не могу ждать завершения потока более 10 мс, будет заметный затык анимации. Можно было бы вынести создание и завершение этих потоков в еще один поток, но слишком геморройно. Передача байта для просыпания тоже не самое красивое решение, если представить путь этого байта от процесса и назад к нему же, но это все равно гораздо лучше опроса 100 (да и даже 10) раз в секунду. Тем более что код будет работать в том числе и на мобилке.
...
Рейтинг: 0 / 0
TIdUDPClient: прервать ожидание
    #39963586
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
misha mike,

Откройте для себя асинхронные сокеты
...
Рейтинг: 0 / 0
TIdUDPClient: прервать ожидание
    #39963595
misha mike
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_, щас, блин. Не хватало мне еще самому это под все платформы писать.
...
Рейтинг: 0 / 0
TIdUDPClient: прервать ожидание
    #39963646
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
misha mikeбудет заметный затык анимации

Какая ещё анимация при завершении работы? И с чего в ней будет затык, если в главном
потоке ты всего лишь устанавливаешь переменную в true?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
TIdUDPClient: прервать ожидание
    #39963813
misha mike
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov, никто не говорил про завершение работы. Речь идет про отключение UDP-канала, которое случается периодически в процессе работы программы.

А затык будет, потому что основному потоку нужно дождаться завершения читающего потока (это решаемо, но в свете непрерывно "молотящего" цикла даже не хочу рассматривать такой вариант).
...
Рейтинг: 0 / 0
TIdUDPClient: прервать ожидание
    #39964019
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
misha mikeА затык будет, потому что основному потоку нужно дождаться завершения читающего потока

WaitForMultipleObjects - не единственный способ дожидаться. Вкуривай event-driven архитектуру.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
TIdUDPClient: прервать ожидание
    #39964070
misha mike
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov, кроссплатформа, блин! Вы тему читали? Если я начну даже сокеты сам реализовывать, поект на год затянется.
...
Рейтинг: 0 / 0
TIdUDPClient: прервать ожидание
    #39964077
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
misha mikeкроссплатформа, блин!

Пофиг. BSD сокеты одинаковы на всех платформах. Windows Messages ничем не отличатся от
X-Windows Events.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
TIdUDPClient: прервать ожидание
    #39964183
misha mike
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

misha mikeкроссплатформа, блин!

Пофиг. BSD сокеты одинаковы на всех платформах.
Угу, вот только BSD сокеты как раз насквозь синхронные, а пулинг везде разный.

Windows Messages ничем не отличатся от
X-Windows Events.
А под ведром что прикажете посылась? Или в огрызке? Я уже молчу, что завязывать подобные вещи на X в линуксах -- совсем уж дурной тон даже для GUI-приложения.
...
Рейтинг: 0 / 0
TIdUDPClient: прервать ожидание
    #39964204
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
misha mikeпулинг везде разный.

select() везде одинаков.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
TIdUDPClient: прервать ожидание
    #39964299
misha mike
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov, select() как бы синхронный. А если навешивать на него еще и семафор для отпускания потока, то это уже за рамками POSIX, и мы возвращаемся иуда же: куча кодинга, отладки, глюков на ровном месте.
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TIdUDPClient: прервать ожидание
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]