|
|
|
TIdUDPClient: прервать ожидание
|
|||
|---|---|---|---|
|
#18+
Всем привет. Ситуация вроде самая стандартная. Есть TIdUDPClient, есть читающий поток, который в цикле вызывает ReceiveBuffer(). Таймаут ожидания бесконечный (это важно), то есть пока нет данных, читающий поток в перманентном ожидании. Вопрос на засыпку: как из основного потока сделать так, чтобы прервать работу ReceiveBuffer() и дать читающему потоку корректно завершиться? Просто закрыть сокет -- не вариант по двум веским причинам (если кому интересно, объясню). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2020, 04:37 |
|
||
|
TIdUDPClient: прервать ожидание
|
|||
|---|---|---|---|
|
#18+
А почему нельзя использовать TIdUdpServer? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2020, 07:47 |
|
||
|
TIdUDPClient: прервать ожидание
|
|||
|---|---|---|---|
|
#18+
misha mike Таймаут ожидания бесконечный (это важно), то есть пока нет данных, читающий поток в перманентном ожидании. Вопрос на засыпку: как из основного потока сделать так, чтобы прервать работу ReceiveBuffer() и дать читающему потоку корректно завершиться? Ответ очевиден. Ожидать не "бесконечно". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2020, 09:08 |
|
||
|
TIdUDPClient: прервать ожидание
|
|||
|---|---|---|---|
|
#18+
misha mikeкак из основного потока сделать так, чтобы прервать работу ReceiveBuffer() и дать читающему потоку корректно завершиться? Естественный ответ: послать ему UDP пакет "завершись!". misha mikeПросто закрыть сокет -- не вариант по двум веским причинам (если кому интересно, объясню). Я подозреваю, что эти две причины не имеют ничего общего с главной и единственной: закрытие сокета не обязано прерывать ожидание. Хотя на Windows и делает это. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2020, 12:09 |
|
||
|
TIdUDPClient: прервать ожидание
|
|||
|---|---|---|---|
|
#18+
DmSer А почему нельзя использовать TIdUdpServer? Может, потому что нужен именно клиент? wadman Ответ очевиден. Ожидать не "бесконечно". Нихрена он не очевиден. И даже вреден. Не думал что тут придется объяснять, почему. Dimitry Sibiryakov Естественный ответ: послать ему UDP пакет "завершись!". Легально послать такой пакет может только сервер, а он ни сном ни духом, что клиент хочет отключиться. Я подозреваю, что эти две причины не имеют ничего общего с главной и единственной: закрытие сокета не обязано прерывать ожидание. Хотя на Windows и делает это. Это одна из причин. А другая в том, что код Indy так написан, что даже если прервать ожидание закрытием, сокет тут же пересоздается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2020, 12:34 |
|
||
|
TIdUDPClient: прервать ожидание
|
|||
|---|---|---|---|
|
#18+
misha mikeЛегально послать такой пакет может только сервер "Чо?" UDP пакет может послать любой. Это всего лишь вызов одной-единственной функции sendto(). Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2020, 12:54 |
|
||
|
TIdUDPClient: прервать ожидание
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov "Чо?" UDP пакет может послать любой. Это всего лишь вызов одной-единственной функции sendto(). Да, таки работает. Просто не думал, что сокет может так просто самому себе отослать байт. Есть некоторые сложности с биндингом на конкретный адаптер, но это решаемо. Спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2020, 13:32 |
|
||
|
TIdUDPClient: прервать ожидание
|
|||
|---|---|---|---|
|
#18+
misha mike, не понял, почему важно бесконечное ожидание? что мешает ждать с таймаутом 1 сек и проверять флаг прерывания? если не установлен, то опять ждем... максимум будет задержка 1 сек на прерывание потока ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2020, 13:38 |
|
||
|
TIdUDPClient: прервать ожидание
|
|||
|---|---|---|---|
|
#18+
misha mike Не думал что тут придется объяснять, почему. Ждем откровений. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2020, 14:30 |
|
||
|
TIdUDPClient: прервать ожидание
|
|||
|---|---|---|---|
|
#18+
Zelius не понял, почему важно бесконечное ожидание? что мешает ждать с таймаутом 1 сек и проверять флаг прерывания? если не установлен, то опять ждем... максимум будет задержка 1 сек на прерывание потока Именно это и мешает. С таким подходом я не могу прибить поток (вместе со всем, что на него завязано) тогда, когда мне это нужно. Вместо этого приходится ждать до истечения таймаута, пока поток просрется очнется и будет готов завершиться. А уменьшение таймаута увеличивает паразитную нагрузку на процессор, и в моем случае его пришлось бы уменьшить до 10 мс, что вообще ни в какие ворота. И да, не нужно забывать про принцип " никогда ничего не опрашивай " (есть перевод от Гансмокера). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2020, 18:45 |
|
||
|
TIdUDPClient: прервать ожидание
|
|||
|---|---|---|---|
|
#18+
misha mike А уменьшение таймаута увеличивает паразитную нагрузку на процессор, и в моем случае его пришлось бы уменьшить до 10 мс, что вообще ни в какие ворота. Страхов так и не нашлось, кроме выдуманных. 100 мс - тоже норм для прерывания, если только не связано с жестким ограничением протоколов при работе с железками. Но даже у еле живых процессоров с их протоколами обычно задержки от 200 мс считаются поводом для паники. Реже меньше 100. Инди - не лучший выбор для критически важных данных. Я-бы свое написал с overlapped io (лет 10 назад), либо взял ICS (сейчас). Там эта "проблема" решена изначально, точнее - не создана. Бонусом нормальная поддержка многопоточности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2020, 19:17 |
|
||
|
TIdUDPClient: прервать ожидание
|
|||
|---|---|---|---|
|
#18+
wadman Страхов так и не нашлось, кроме выдуманных. 100 мс - тоже норм для прерывания, если только не связано с жестким ограничением протоколов при работе с железками. Но даже у еле живых процессоров с их протоколами обычно задержки от 200 мс считаются поводом для паники. Реже меньше 100. Я не могу ждать завершения потока более 10 мс, будет заметный затык анимации. Можно было бы вынести создание и завершение этих потоков в еще один поток, но слишком геморройно. Передача байта для просыпания тоже не самое красивое решение, если представить путь этого байта от процесса и назад к нему же, но это все равно гораздо лучше опроса 100 (да и даже 10) раз в секунду. Тем более что код будет работать в том числе и на мобилке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2020, 19:42 |
|
||
|
TIdUDPClient: прервать ожидание
|
|||
|---|---|---|---|
|
#18+
misha mike, Откройте для себя асинхронные сокеты ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2020, 19:42 |
|
||
|
TIdUDPClient: прервать ожидание
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_, щас, блин. Не хватало мне еще самому это под все платформы писать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2020, 19:52 |
|
||
|
TIdUDPClient: прервать ожидание
|
|||
|---|---|---|---|
|
#18+
misha mikeбудет заметный затык анимации Какая ещё анимация при завершении работы? И с чего в ней будет затык, если в главном потоке ты всего лишь устанавливаешь переменную в true? Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2020, 21:34 |
|
||
|
TIdUDPClient: прервать ожидание
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, никто не говорил про завершение работы. Речь идет про отключение UDP-канала, которое случается периодически в процессе работы программы. А затык будет, потому что основному потоку нужно дождаться завершения читающего потока (это решаемо, но в свете непрерывно "молотящего" цикла даже не хочу рассматривать такой вариант). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2020, 03:13 |
|
||
|
TIdUDPClient: прервать ожидание
|
|||
|---|---|---|---|
|
#18+
misha mikeА затык будет, потому что основному потоку нужно дождаться завершения читающего потока WaitForMultipleObjects - не единственный способ дожидаться. Вкуривай event-driven архитектуру. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2020, 12:54 |
|
||
|
TIdUDPClient: прервать ожидание
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, кроссплатформа, блин! Вы тему читали? Если я начну даже сокеты сам реализовывать, поект на год затянется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2020, 13:50 |
|
||
|
TIdUDPClient: прервать ожидание
|
|||
|---|---|---|---|
|
#18+
misha mikeкроссплатформа, блин! Пофиг. BSD сокеты одинаковы на всех платформах. Windows Messages ничем не отличатся от X-Windows Events. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2020, 14:06 |
|
||
|
TIdUDPClient: прервать ожидание
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov misha mikeкроссплатформа, блин! Пофиг. BSD сокеты одинаковы на всех платформах. Угу, вот только BSD сокеты как раз насквозь синхронные, а пулинг везде разный. Windows Messages ничем не отличатся от X-Windows Events. А под ведром что прикажете посылась? Или в огрызке? Я уже молчу, что завязывать подобные вещи на X в линуксах -- совсем уж дурной тон даже для GUI-приложения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2020, 17:04 |
|
||
|
TIdUDPClient: прервать ожидание
|
|||
|---|---|---|---|
|
#18+
misha mikeпулинг везде разный. select() везде одинаков. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2020, 17:55 |
|
||
|
TIdUDPClient: прервать ожидание
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, select() как бы синхронный. А если навешивать на него еще и семафор для отпускания потока, то это уже за рамками POSIX, и мы возвращаемся иуда же: куча кодинга, отладки, глюков на ровном месте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2020, 04:12 |
|
||
|
|

start [/forum/topic.php?fid=58&fpage=43&tid=2038262]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
31ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
47ms |
get tp. blocked users: |
1ms |
| others: | 246ms |
| total: | 365ms |

| 0 / 0 |
