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