Вверх ↑
Ответов: 4621
Рейтинг: 746
#1: 2017-05-18 11:24:39 ЛС | профиль | цитата
Вроде выглядит неплохо. Попробую как-нибудь протестировать.

По поводу "кольцевания". Пока что столкнулся с тем, что при использовании критической секции для "последовательной выдачи" событий компонента (чтобы события с разных потоков в одном компоненте не происходили одновременно), получается deadlock при такой последовательности:
- параллельный поток захватывает секцию и вызывает событие
- в этот момент главный поток вызывает метод, который должен выдать событие, использующее ту же секцию, и становится на ожидание её освобождения
- а событие параллельного потока внутри секции обращается к какому-нибудь визуальному компоненту, который посылая сообщение в главный поток, блокирует параллельный поток.
Оба потока ожидают освобождения друг друга.
Подумываю, что решением для "последовательной выдачи событий" будет некая "очередь событий", когда главный поток при вызове методов никак не блокируется внутри компонента, а просто помещает требование вызвать событие в эту очередь. Что-то типа DeferredEvent, но внутри компонента, без использования сообщений Windows.
карма: 26

0
Редактировалось 2 раз(а), последний 2017-05-18 11:27:41