Вверх ↑
Ответов: 4628
Рейтинг: 749
#1: 2017-04-21 12:28:42 ЛС | профиль | цитата
Gunnman писал(а):
если AsyncEvents=True то ответы получаю не на все отправленные команды
Если данные отправляются из главного потока (например, по командах обычного таймера), то при AsyncEvents=False событие onReceive не произойдёт, пока не отработает событие таймера (в твоем случае когда весь список команд будет перебран). После отработки поток приёма данных получает возможность вызвать все необходимые события onReceive.
При AsyncEvents=True (или при переборе команд с вызовом doSend не из главного потока) событие onReceive может произойти в процессе перебора - ты шлешь очередную команду очередному клиенту и в это самое время может произойти событие onReceive как ответ от предыдущего клиента.

Мне кажется, тут нужно менять логику в схеме для реализации "запрос-ответ". Это не принципиально зависит от AsyncEvents - в любом случае тебе нужно дождаться прихода ответа, причем, в правильном порядке.
Сделать это можно так. Специальный паралельный поток сбрасывает событие (компонент Events) затем шлет одну команду и останавливается на ожидание срабатывания события (компонент WaitObject). Событие onReceive выполняет необходимую обработку ответа, а затем сигналит то же событие Events, позволяя отправляющему потоку продолжить исполнение и отправить следующую команду.

Gunnman писал(а):
что в этом случае происходит с потоком по истечению 1000ms?
Если под "потоком" имеется в виду компонент Thread, то в этом случае ничего не происходит - поток остановится, пока данные не будут отправлены. Если данные не были приняты клиентом на протяжении SendTimeout, сработает событие onErrorSend.
Но тут есть одна проблемка: у сокета есть свой буфер. И если при отправке в буфере есть свободное место, то новые данные будут записаны в буфер, метод doSend/doSendAsync отработает сразу, событие onSend будет получено. При этом, не факт что клиент эти данные получит: если после этого глюкнет сеть или клиент отключится, то мы получим событие onDisconnect (поток приема данных обнаружит ошибку чтения сокета, хотя, возможно, и не всегда), но мы не сможем узнать сколько реально клиент смог принять данных из буфера перед обрывом. Отправка следующих данных выдаст onErrorSend.
Если в буфере при отправке нет свободного места, отправляющий поток приостановится до освобождения буфера.
карма: 26

1
Голосовали:Gunnman
Редактировалось 2 раз(а), последний 2017-05-25 11:27:00