Здравствуйте!
В программе (C#) используется COM-dll драйвер ус-ва, который реализует протокол МОДБАС для связи через ком-порт.
Во время считывания инфы через драйвер в асинхронном таймере (System.Threading.Timer), блокируется основная форма приложения.
Если закомментить код, работающий с драйвером, блокировки не происходит.
Если кто-то сталкивался с подобной проблемой, прошу помочь или навести на мысль как с этим бороться.
Спасибо!
Пробовал создавать класс-обертку для драйвера (не переписывал RCW конечно), который работал с драйвером в отдельном потоке, задавал при создании разные апартаменты, однако блокировки никуда не делись.
Здравствуйте, devision, Вы писали:
D>Пробовал создавать класс-обертку для драйвера (не переписывал RCW конечно), который работал с драйвером в отдельном потоке, задавал при создании разные апартаменты, однако блокировки никуда не делись.
Здравствуйте, devision, Вы писали:
K>>Попробуй сменить COM apartment на MTA D>При создании потока пробовал указывать и STA и MTA — разницы, увы, не было
При STA ты _создавал_ объект в том же потоке, в котором потом работал с ним? (т.е. не в главном GUI-потоке)
K>При STA ты _создавал_ объект в том же потоке, в котором потом работал с ним? (т.е. не в главном GUI-потоке)
Спасибо за подсказку ) Действительно, объект создавался в GUI-потоке. Если создавать его в методе, на который указывает ThreadStart (к примеру DoWork()), главная форма не блокируется в независимости от типа апартаментов, указанных при создании потока. Но в этом случае возникает другой вопрос — как обращаться к методам этого объекта, инициализированного в DoWork(), из GUI-потока?
Здравствуйте, devision, Вы писали:
D>Спасибо за подсказку ) Действительно, объект создавался в GUI-потоке. Если создавать его в методе, на который указывает ThreadStart (к примеру DoWork()), главная форма не блокируется в независимости от типа апартаментов, указанных при создании потока. Но в этом случае возникает другой вопрос — как обращаться к методам этого объекта, инициализированного в DoWork(), из GUI-потока?
Напрямую никак — только через некую диспетчеризацию (например, организовать очередь сообщений в этом потоке, и ставить из гуйного потока туда мессаги, а затем забирать результаты).