|
Использование компонентов Indy10: нужно прервать операцию чтение при наступлении события
|
|||
---|---|---|---|
#18+
TIdTCPServer. Читаю с помощью метода ReadXXX данные от клиента "А", таймаут 10 секунд. Но если от другого клиента "Б" пришла определённая информация, то мне нужно прервать вызов ReadXXX и отправить клиенту "А" информацию от клиента "Б". Раньше я эту задачу легко решал за счёт мелких таймаутов по 20 мс. Но клиентов "А" и "Б" может быть по 1000 шт, поэтому мелкие таймауты приводят к 100% загрузке процессора. Приходилось ли кому-нибудь решать такую задачу? Как решали? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.08.2021, 18:29 |
|
Использование компонентов Indy10: нужно прервать операцию чтение при наступлении события
|
|||
---|---|---|---|
#18+
Нашёл гениальный ответ от автора Indy: The only way to immediately abort a blocking socket operation before its timeout elapses is to disconnect the socket from another thread. -- Remy Lebeau (TeamB) Как-то не очень подходит такой способ... ... |
|||
:
Нравится:
Не нравится:
|
|||
03.08.2021, 19:04 |
|
Использование компонентов Indy10: нужно прервать операцию чтение при наступлении события
|
|||
---|---|---|---|
#18+
DmSer, читаете в обработчике события OnExecute или как-то иначе? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.08.2021, 19:54 |
|
Использование компонентов Indy10: нужно прервать операцию чтение при наступлении события
|
|||
---|---|---|---|
#18+
именно так! ... |
|||
:
Нравится:
Не нравится:
|
|||
03.08.2021, 20:39 |
|
Использование компонентов Indy10: нужно прервать операцию чтение при наступлении события
|
|||
---|---|---|---|
#18+
DmSer, Приходилось ли кому-нибудь решать такую задачу? Как решали? Нет, не приходилось (сначала не совсем понял описание ситуации, поэтому уточнял). Я в свое время перестал использовать Indy, правда делал не серверные, а клиентские приложения, стал использовать вот такое: http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1060#06 Тут проблема решается просто: чтение вообще происходит только тогда, когда что-то пришло во входной буфер, а ваша ситуация сводится к "взведению" события и отправке того, что нужно. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.08.2021, 22:03 |
|
Использование компонентов Indy10: нужно прервать операцию чтение при наступлении события
|
|||
---|---|---|---|
#18+
Я решил, что оставлю на Indy, но избавлюсь от мелких таймаутов. Если увеличить паузы до 50 мс, то нагрузка на процессор снизится в 2 раза. А дальше видно будет. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.08.2021, 07:37 |
|
Использование компонентов Indy10: нужно прервать операцию чтение при наступлении события
|
|||
---|---|---|---|
#18+
До-свидания Инди и добро пожаловать в мир неблокирующих сокетов. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.08.2021, 11:36 |
|
Использование компонентов Indy10: нужно прервать операцию чтение при наступлении события
|
|||
---|---|---|---|
#18+
04.08.2021 11:36, _Vasilisk_ пишет: > До-свидания Инди и добро пожаловать в мир неблокирующих сокетов. но всё одно, некоторым кактус жрать привычней... Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
04.08.2021, 11:38 |
|
Использование компонентов Indy10: нужно прервать операцию чтение при наступлении события
|
|||
---|---|---|---|
#18+
Если ты вызываешь блокирующую операцию на сокете, поток уходит внутрь winsock и конечно оттуда выполнение не отменить. Раньше была WSACancelBlockingCall, но ее убрали. Так что да, таймаут и цикл. Можно и 100 мс сделать, вряд ли разницу кто-то заметит ... |
|||
:
Нравится:
Не нравится:
|
|||
04.08.2021, 11:40 |
|
Использование компонентов Indy10: нужно прервать операцию чтение при наступлении события
|
|||
---|---|---|---|
#18+
Fr0sT-Brutal ... Так что да, таймаут и цикл. Можно и 100 мс сделать, вряд ли разницу кто-то заметит ... |
|||
:
Нравится:
Не нравится:
|
|||
04.08.2021, 12:18 |
|
Использование компонентов Indy10: нужно прервать операцию чтение при наступлении события
|
|||
---|---|---|---|
#18+
_Vasilisk_ До-свидания Инди и добро пожаловать в мир неблокирующих сокетов. Хотелось так сделать. Но когда оцениваешь трудодни, выходит, что пауза 50 мс выйдет намного дешевле. 100 мс уже многовато, т.к. явно повлияет на общую длительность обмена между офисом и оборудованием. Хотя, какие реально задержки там сейчас из-за высокой загрузки процессора - не знаю. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.08.2021, 16:32 |
|
Использование компонентов Indy10: нужно прервать операцию чтение при наступлении события
|
|||
---|---|---|---|
#18+
_Vasilisk_ До-свидания Инди и добро пожаловать в мир неблокирующих сокетов. Неблок сокет, кстати, не сильно тут поможет, т.к. тот же самый вызов read в цикле. Возможно, ты имел в виду асинхронный. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.08.2021, 16:39 |
|
Использование компонентов Indy10: нужно прервать операцию чтение при наступлении события
|
|||
---|---|---|---|
#18+
Fr0sT-Brutal Возможно, ты имел в виду асинхронный. Fr0sT-Brutal тот же самый вызов read в цикле ... |
|||
:
Нравится:
Не нравится:
|
|||
04.08.2021, 17:14 |
|
Использование компонентов Indy10: нужно прервать операцию чтение при наступлении события
|
|||
---|---|---|---|
#18+
Fr0sT-Brutal _Vasilisk_ До-свидания Инди и добро пожаловать в мир неблокирующих сокетов. Неблок сокет, кстати, не сильно тут поможет, т.к. тот же самый вызов read в цикле. Возможно, ты имел в виду асинхронный. Разница есть. В одном случае цикл в 1000 потоках, в другом только в одном потоке. С одним потоком можно было бы таймер на 10 мс завести. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.08.2021, 18:40 |
|
Использование компонентов Indy10: нужно прервать операцию чтение при наступлении события
|
|||
---|---|---|---|
#18+
DmSer В одном случае цикл в 1000 потоках ... |
|||
:
Нравится:
Не нравится:
|
|||
04.08.2021, 22:15 |
|
Использование компонентов Indy10: нужно прервать операцию чтение при наступлении события
|
|||
---|---|---|---|
#18+
_Vasilisk_ Fr0sT-Brutal Возможно, ты имел в виду асинхронный. Имхо это всё термины придуманные троешниками. Сокет, как и любой последовательный порт компьютера не может быть асинхронным/синхронным, блокирующим/неблокирующим. Вот работать с ним можно как раз в двух режимах. В асинхронном он же неблокирующий или в синхронном он же блокирующий. Те кто начинал с MS DOS это хорошо понимают, ибо там был доступ к аппаратным прерываниям. В современной Винде к аппаратным прерываний доступа из третьего кольца нет, но есть события. Таким образом можно в отдельном потоке ждать наступления события и только после этого что-то читать из порта/сокета или писать в него. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2021, 02:36 |
|
Использование компонентов Indy10: нужно прервать операцию чтение при наступлении события
|
|||
---|---|---|---|
#18+
Кстати мне и наверное не только мне очень повезло, что уже в эпоху Д1 бельгийский француз Franзois PIETTE сделал библиотеку с компонентами для работы с сокетами. В последствии она получила имя ICS. Работала она асинхронно и работала прекрасно. Жаль что папаша Борланд не нашел вариантов совместить свою платную Дельфи с требованием Франсуа о бесплатности его библиотеки. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2021, 02:49 |
|
Использование компонентов Indy10: нужно прервать операцию чтение при наступлении события
|
|||
---|---|---|---|
#18+
northener Кстати мне и наверное не только мне очень повезло, что уже в эпоху Д1 бельгийский француз Franзois PIETTE сделал библиотеку с компонентами для работы с сокетами. В последствии она получила имя ICS. Работала она асинхронно и работала прекрасно. Жаль что папаша Борланд не нашел вариантов совместить свою платную Дельфи с требованием Франсуа о бесплатности его библиотеки. Она и по сей день активно развивается и бесплатная. Вроде для macOS поддержку сделали. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2021, 07:11 |
|
Использование компонентов Indy10: нужно прервать операцию чтение при наступлении события
|
|||
---|---|---|---|
#18+
_Vasilisk_ Так, сейчас а засомневался, но мне казалось, что термина "асинхронный сокет" не существует. Есть именно неблокирующий. Конечно, тут некоторая условность. Сокет один, но режимы разные. Есть блокирующий, с которым все понятно. Есть неблокирующий, достигаемый через setsockopt - все функции те же самые, но вызовы завершаются сразу. И есть, скажем так, подписка на события сокета, через виндовые сообщения и коллбэки. _Vasilisk_ Нет. Это ты сейчас рассказываешь про работу блокирующего сокета с нулевым таймаутом. Нет, это я про неблок. Тебе же все равно надо читать из него. А как узнаешь, что там что-то появилось? Только read либо select. D случае сервера максимум, что можно сделать, это объединить несколько сокетов в один вызов select, но все равно их надо постоянно дергать. WaitFor функции с сокетами не работают. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2021, 10:12 |
|
Использование компонентов Indy10: нужно прервать операцию чтение при наступлении события
|
|||
---|---|---|---|
#18+
Fr0sT-Brutal но все равно их надо постоянно дергать. WaitFor функции с сокетами не работают. https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-wsaeventselect ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2021, 10:45 |
|
Использование компонентов Indy10: нужно прервать операцию чтение при наступлении события
|
|||
---|---|---|---|
#18+
Fr0sT-Brutal . Есть неблокирующий, достигаемый через setsockopt Fr0sT-Brutal WaitFor функции с сокетами не работают. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2021, 14:33 |
|
Использование компонентов Indy10: нужно прервать операцию чтение при наступлении события
|
|||
---|---|---|---|
#18+
Kazantsev Alexey Fr0sT-Brutal но все равно их надо постоянно дергать. WaitFor функции с сокетами не работают. https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-wsaeventselect И как эта ссылка релевантна? _Vasilisk_ С каким параметром? Ыть, попутал. ioctlsocket _Vasilisk_ Fr0sT-Brutal WaitFor функции с сокетами не работают. Да нет конечно, майки так шутят https://docs.microsoft.com/en-us/windows/win32/api/synchapi/nf-synchapi-waitformultipleobjectsex ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2021, 15:19 |
|
Использование компонентов Indy10: нужно прервать операцию чтение при наступлении события
|
|||
---|---|---|---|
#18+
Fr0sT-Brutal И как эта ссылка релевантна? Связываешь события с сокетами и сидишь на событиях. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2021, 15:41 |
|
Использование компонентов Indy10: нужно прервать операцию чтение при наступлении события
|
|||
---|---|---|---|
#18+
Поправил свой сервер. Теперь использую в основном CheckForDataOnSource с таймаутом 200 мс (а в цикле обмена между офисом и оборудованием использую таймаут 50 мс, вместо значения 1 мс, которое вляпал туда лет 5 назад по незнанию). На каждый поток теперь в среднем 5 переключений контекста в секунду (до этого было более 20-ти). Нагрузка на процессор значительно снизилась (по ощущению, раза в 3). ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2021, 15:51 |
|
Использование компонентов Indy10: нужно прервать операцию чтение при наступлении события
|
|||
---|---|---|---|
#18+
DmSer northener Кстати мне и наверное не только мне очень повезло, что уже в эпоху Д1 бельгийский француз Franзois PIETTE сделал библиотеку с компонентами для работы с сокетами. В последствии она получила имя ICS. Работала она асинхронно и работала прекрасно. Жаль что папаша Борланд не нашел вариантов совместить свою платную Дельфи с требованием Франсуа о бесплатности его библиотеки. Она и по сей день активно развивается и бесплатная. Вроде для macOS поддержку сделали. Эт да. Но косяков в ней явно прибавилось. Правда я её последний раз попробовал применить в новом проекте 10 лет назад. Может за это время что-то изменилось в сторону улучшения? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2021, 02:29 |
|
|
start [/forum/topic.php?fid=58&msg=40088476&tid=2037126]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
45ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
70ms |
get tp. blocked users: |
1ms |
others: | 16ms |
total: | 177ms |
0 / 0 |