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

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


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

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

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

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

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


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

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

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


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

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


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

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

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

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

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


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

Эт да. Но косяков в ней явно прибавилось.
Правда я её последний раз попробовал применить в новом проекте 10 лет назад. Может за это время что-то изменилось в сторону улучшения?
...
Рейтинг: 0 / 0
Использование компонентов Indy10: нужно прервать операцию чтение при наступлении события
    #40089080
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Kazantsev Alexey
Fr0sT-Brutal
И как эта ссылка релевантна?

Связываешь события с сокетами и сидишь на событиях.

Покапитанил?)) Я отдельно говорил про WSAASync и события. Но это уже совсем другая архитектура. Переделывать сколько-нибудь солидный софт с блока на события даже врагу не пожелаю.
northener
DmSer
пропущено...
Она и по сей день активно развивается и бесплатная. Вроде для macOS поддержку сделали.

Эт да. Но косяков в ней явно прибавилось.
Правда я её последний раз попробовал применить в новом проекте 10 лет назад. Может за это время что-то изменилось в сторону улучшения?

Сижу на свежем транке, софт крутится 24/7, все хорошо. Правда, юзаю только базовые сокеты
...
Рейтинг: 0 / 0
Использование компонентов Indy10: нужно прервать операцию чтение при наступлении события
    #40089102
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fr0sT-Brutal
Покапитанил?))

Ты сказал, что WaitFor с сокетами не работает, я показал что сделать, чтобы работала.
...
Рейтинг: 0 / 0
Использование компонентов Indy10: нужно прервать операцию чтение при наступлении события
    #40089243
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Kazantsev Alexey
Ты сказал, что WaitFor с сокетами не работает, я показал что сделать, чтобы работала.

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


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