Вверх ↑
Ответов: 4622
Рейтинг: 746
#1: 2017-04-20 16:07:09 ЛС | профиль | цитата
Gunnman писал(а):
Какие события происходят в одном потоке а какие в разных?

События onConnect/onErrorConnect происходят либо в потоке, вызвавшем doConnect (при AsyncConnect=False), либо в параллельном потоке (при AsyncConnect=True)

События onSend/onErrorSend происходят либо в потоке, вызвавшем doSend, либо в параллельном потоке после doSendAsync

Событие onReceive происходит в параллельном потоке чтения данных, onClientConnect - в параллельном потоке приёма подключений.

Событие onDisconnect/onClientDisconnect происходит либо в потоке, вызвавшем doDisconnect, либо в параллельном потоке чтения данных.

Поскольку прием данных и асинхронную отправку обслуживают по несколько параллельных потоков, то источником одного события в разное время могут быть разные потоки. Но, так как точка события одна, то нужно считать, что оно просто происходит в параллельном потоке (а каком именно - для автора схемы не имеет значения).

Если свойство AsyncEvents=False, то все перечисленные события, происходящие в параллельных потоках, вызываются из главного потока приложения (очереди сообщений). Для невизуальных приложений (не имеющих очереди сообщений), AsyncEvents всегда True.

Gunnman писал(а):
Правильно ли в моей схеме используется критическая секция?
Вроде правильно, только AsyncEvents наверное должно быть True. Аккуратно следует использовать критическую секцию на событиях из главного потока (например, события от оконных элементов). Возможна такая ситуация, когда параллельный поток заходит в секцию, затем вызывает метод какого-то визуального компонента, в результате которого генерируется оконное сообщение и метод должен дождаться обработки этого сообщения. Тогда, если на это сообщение есть событие, использующее ту же критическую секцию, произойдёт deadlock: праллельный поток ждёт обработки сообщения, а главный поток не может завершить его обработку, так как ждёт освобождения критической секции параллельным потоком.
карма: 26

0
Редактировалось 4 раз(а), последний 2017-04-20 16:20:05