Гость
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Использование компонентов Indy10: нужно прервать операцию чтение при наступлении события / 25 сообщений из 28, страница 1 из 2
03.08.2021, 18:29
    #40088328
DmSer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование компонентов Indy10: нужно прервать операцию чтение при наступлении события
TIdTCPServer.
Читаю с помощью метода ReadXXX данные от клиента "А", таймаут 10 секунд.
Но если от другого клиента "Б" пришла определённая информация, то мне нужно прервать вызов ReadXXX и отправить клиенту "А" информацию от клиента "Б".

Раньше я эту задачу легко решал за счёт мелких таймаутов по 20 мс. Но клиентов "А" и "Б" может быть по 1000 шт, поэтому мелкие таймауты приводят к 100% загрузке процессора.


Приходилось ли кому-нибудь решать такую задачу? Как решали?
...
Рейтинг: 0 / 0
03.08.2021, 19:04
    #40088349
DmSer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование компонентов Indy10: нужно прервать операцию чтение при наступлении события
Нашёл гениальный ответ от автора 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)

Как-то не очень подходит такой способ...
...
Рейтинг: 0 / 0
03.08.2021, 19:54
    #40088366
s62
s62
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование компонентов Indy10: нужно прервать операцию чтение при наступлении события
DmSer,

читаете в обработчике события OnExecute или как-то иначе?
...
Рейтинг: 0 / 0
03.08.2021, 20:39
    #40088385
DmSer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование компонентов Indy10: нужно прервать операцию чтение при наступлении события
именно так!
...
Рейтинг: 0 / 0
03.08.2021, 22:03
    #40088422
s62
s62
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование компонентов Indy10: нужно прервать операцию чтение при наступлении события
DmSer,
Приходилось ли кому-нибудь решать такую задачу? Как решали? Нет, не приходилось (сначала не совсем понял описание ситуации, поэтому уточнял).

Я в свое время перестал использовать Indy, правда делал не серверные, а клиентские приложения, стал использовать вот такое: http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1060#06
Тут проблема решается просто: чтение вообще происходит только тогда, когда что-то пришло во входной буфер, а ваша ситуация сводится к "взведению" события и отправке того, что нужно.
...
Рейтинг: 0 / 0
04.08.2021, 07:37
    #40088476
DmSer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование компонентов Indy10: нужно прервать операцию чтение при наступлении события
Я решил, что оставлю на Indy, но избавлюсь от мелких таймаутов. Если увеличить паузы до 50 мс, то нагрузка на процессор снизится в 2 раза. А дальше видно будет.
...
Рейтинг: 0 / 0
04.08.2021, 11:36
    #40088535
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование компонентов Indy10: нужно прервать операцию чтение при наступлении события
До-свидания Инди и добро пожаловать в мир неблокирующих сокетов.
...
Рейтинг: 0 / 0
04.08.2021, 11:38
    #40088538
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование компонентов Indy10: нужно прервать операцию чтение при наступлении события
04.08.2021 11:36, _Vasilisk_ пишет:

> До-свидания Инди и добро пожаловать в мир неблокирующих сокетов.

но всё одно, некоторым кактус жрать привычней...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
04.08.2021, 11:40
    #40088540
Fr0sT-Brutal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование компонентов Indy10: нужно прервать операцию чтение при наступлении события
Если ты вызываешь блокирующую операцию на сокете, поток уходит внутрь winsock и конечно оттуда выполнение не отменить. Раньше была WSACancelBlockingCall, но ее убрали. Так что да, таймаут и цикл. Можно и 100 мс сделать, вряд ли разницу кто-то заметит
...
Рейтинг: 0 / 0
04.08.2021, 12:18
    #40088563
s62
s62
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование компонентов Indy10: нужно прервать операцию чтение при наступлении события
Fr0sT-Brutal
... Так что да, таймаут и цикл. Можно и 100 мс сделать, вряд ли разницу кто-то заметит
Я тоже подумал про такое. Но тут зависит от задачи наверное. Приходят ли эти сообщения как текст для пользователя, или может данные приходят и тут же обрабатываются программно. Как быстро их надо обработать и как часто они приходят и т.д. В какой-то ситуации может и 200 мс или больше можно сделать.
...
Рейтинг: 0 / 0
04.08.2021, 16:32
    #40088681
DmSer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование компонентов Indy10: нужно прервать операцию чтение при наступлении события
_Vasilisk_
До-свидания Инди и добро пожаловать в мир неблокирующих сокетов.


Хотелось так сделать. Но когда оцениваешь трудодни, выходит, что пауза 50 мс выйдет намного дешевле.
100 мс уже многовато, т.к. явно повлияет на общую длительность обмена между офисом и оборудованием.
Хотя, какие реально задержки там сейчас из-за высокой загрузки процессора - не знаю.
...
Рейтинг: 0 / 0
04.08.2021, 16:39
    #40088683
Fr0sT-Brutal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование компонентов Indy10: нужно прервать операцию чтение при наступлении события
_Vasilisk_
До-свидания Инди и добро пожаловать в мир неблокирующих сокетов.

Неблок сокет, кстати, не сильно тут поможет, т.к. тот же самый вызов read в цикле. Возможно, ты имел в виду асинхронный.
...
Рейтинг: 0 / 0
04.08.2021, 17:14
    #40088690
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование компонентов Indy10: нужно прервать операцию чтение при наступлении события
Fr0sT-Brutal
Возможно, ты имел в виду асинхронный.
Так, сейчас а засомневался, но мне казалось, что термина "асинхронный сокет" не существует. Есть именно неблокирующий.
Fr0sT-Brutal
тот же самый вызов read в цикле
Нет. Это ты сейчас рассказываешь про работу блокирующего сокета с нулевым таймаутом.
...
Рейтинг: 0 / 0
04.08.2021, 18:40
    #40088719
DmSer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование компонентов Indy10: нужно прервать операцию чтение при наступлении события
Fr0sT-Brutal
_Vasilisk_
До-свидания Инди и добро пожаловать в мир неблокирующих сокетов.

Неблок сокет, кстати, не сильно тут поможет, т.к. тот же самый вызов read в цикле. Возможно, ты имел в виду асинхронный.


Разница есть. В одном случае цикл в 1000 потоках, в другом только в одном потоке. С одним потоком можно было бы таймер на 10 мс завести.
...
Рейтинг: 0 / 0
04.08.2021, 22:15
    #40088740
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование компонентов Indy10: нужно прервать операцию чтение при наступлении события
DmSer
В одном случае цикл в 1000 потоках
Откуда взялся цикл в 1000 потоках?
...
Рейтинг: 0 / 0
05.08.2021, 02:36
    #40088753
northener
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование компонентов Indy10: нужно прервать операцию чтение при наступлении события
_Vasilisk_
Fr0sT-Brutal
Возможно, ты имел в виду асинхронный.
Так, сейчас а засомневался, но мне казалось, что термина "асинхронный сокет" не существует. Есть именно неблокирующий.

Имхо это всё термины придуманные троешниками. Сокет, как и любой последовательный порт компьютера не может быть асинхронным/синхронным, блокирующим/неблокирующим. Вот работать с ним можно как раз в двух режимах. В асинхронном он же неблокирующий или в синхронном он же блокирующий. Те кто начинал с MS DOS это хорошо понимают, ибо там был доступ к аппаратным прерываниям. В современной Винде к аппаратным прерываний доступа из третьего кольца нет, но есть события. Таким образом можно в отдельном потоке ждать наступления события и только после этого что-то читать из порта/сокета или писать в него.
...
Рейтинг: 0 / 0
05.08.2021, 02:49
    #40088754
northener
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование компонентов Indy10: нужно прервать операцию чтение при наступлении события
Кстати мне и наверное не только мне очень повезло, что уже в эпоху Д1 бельгийский француз Franзois PIETTE сделал библиотеку с компонентами для работы с сокетами. В последствии она получила имя ICS. Работала она асинхронно и работала прекрасно. Жаль что папаша Борланд не нашел вариантов совместить свою платную Дельфи с требованием Франсуа о бесплатности его библиотеки.
...
Рейтинг: 0 / 0
05.08.2021, 07:11
    #40088757
DmSer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование компонентов Indy10: нужно прервать операцию чтение при наступлении события
northener
Кстати мне и наверное не только мне очень повезло, что уже в эпоху Д1 бельгийский француз Franзois PIETTE сделал библиотеку с компонентами для работы с сокетами. В последствии она получила имя ICS. Работала она асинхронно и работала прекрасно. Жаль что папаша Борланд не нашел вариантов совместить свою платную Дельфи с требованием Франсуа о бесплатности его библиотеки.


Она и по сей день активно развивается и бесплатная. Вроде для macOS поддержку сделали.
...
Рейтинг: 0 / 0
05.08.2021, 10:12
    #40088781
Fr0sT-Brutal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование компонентов Indy10: нужно прервать операцию чтение при наступлении события
_Vasilisk_
Так, сейчас а засомневался, но мне казалось, что термина "асинхронный сокет" не существует. Есть именно неблокирующий.

Конечно, тут некоторая условность. Сокет один, но режимы разные. Есть блокирующий, с которым все понятно. Есть неблокирующий, достигаемый через setsockopt - все функции те же самые, но вызовы завершаются сразу. И есть, скажем так, подписка на события сокета, через виндовые сообщения и коллбэки.
_Vasilisk_
Нет. Это ты сейчас рассказываешь про работу блокирующего сокета с нулевым таймаутом.

Нет, это я про неблок. Тебе же все равно надо читать из него. А как узнаешь, что там что-то появилось? Только read либо select. D случае сервера максимум, что можно сделать, это объединить несколько сокетов в один вызов select, но все равно их надо постоянно дергать. WaitFor функции с сокетами не работают.
...
Рейтинг: 0 / 0
05.08.2021, 10:45
    #40088798
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование компонентов Indy10: нужно прервать операцию чтение при наступлении события
Fr0sT-Brutal
но все равно их надо постоянно дергать. WaitFor функции с сокетами не работают.

https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-wsaeventselect
...
Рейтинг: 0 / 0
05.08.2021, 14:33
    #40088905
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование компонентов Indy10: нужно прервать операцию чтение при наступлении события
Fr0sT-Brutal
. Есть неблокирующий, достигаемый через setsockopt
С каким параметром?
Fr0sT-Brutal
WaitFor функции с сокетами не работают.
Серьезно?
...
Рейтинг: 0 / 0
05.08.2021, 15:19
    #40088925
Fr0sT-Brutal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование компонентов Indy10: нужно прервать операцию чтение при наступлении события
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
...
Рейтинг: 0 / 0
05.08.2021, 15:41
    #40088934
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование компонентов Indy10: нужно прервать операцию чтение при наступлении события
Fr0sT-Brutal
И как эта ссылка релевантна?

Связываешь события с сокетами и сидишь на событиях.
...
Рейтинг: 0 / 0
05.08.2021, 15:51
    #40088940
DmSer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование компонентов Indy10: нужно прервать операцию чтение при наступлении события
Поправил свой сервер. Теперь использую в основном CheckForDataOnSource с таймаутом 200 мс (а в цикле обмена между офисом и оборудованием использую таймаут 50 мс, вместо значения 1 мс, которое вляпал туда лет 5 назад по незнанию). На каждый поток теперь в среднем 5 переключений контекста в секунду (до этого было более 20-ти).
Нагрузка на процессор значительно снизилась (по ощущению, раза в 3).
...
Рейтинг: 0 / 0
06.08.2021, 02:29
    #40089055
northener
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование компонентов Indy10: нужно прервать операцию чтение при наступлении события
DmSer
northener
Кстати мне и наверное не только мне очень повезло, что уже в эпоху Д1 бельгийский француз Franзois PIETTE сделал библиотеку с компонентами для работы с сокетами. В последствии она получила имя ICS. Работала она асинхронно и работала прекрасно. Жаль что папаша Борланд не нашел вариантов совместить свою платную Дельфи с требованием Франсуа о бесплатности его библиотеки.


Она и по сей день активно развивается и бесплатная. Вроде для macOS поддержку сделали.

Эт да. Но косяков в ней явно прибавилось.
Правда я её последний раз попробовал применить в новом проекте 10 лет назад. Может за это время что-то изменилось в сторону улучшения?
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Использование компонентов Indy10: нужно прервать операцию чтение при наступлении события / 25 сообщений из 28, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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