Russian Qt Forum

Qt => Дополнительные компоненты => Тема начата: Dolu от Октябрь 21, 2014, 14:36



Название: Работа с COM в MTA и QApplication
Отправлено: Dolu от Октябрь 21, 2014, 14:36
Добрый день!

Проблема: нужно работать с COM-объектом в многопоточной среде. COM обёрнут QAxObject.
В консольном приложении (QCoreApplication) всё хорошо, но при создании QApplication, начинается беда.
Дело в том, что в конструкторе QApplication происходит вызов OleInitialize(NULL), а он за собой тянет вызов CoInitializeEx(NULL, COINIT_APARTMENTTHREADED), и в этом случае из других потоков доступа к COM нет :-(
Если после создания QApplication, переинициализировать COM:
CoUninitialize();
CoInitializeEx( NULL, COINIT_MULTITHREADED );
то перестают вызываться QFileDialog, например... и вообще много, что перестаёт работать.

Сталкивался ли кто с данной проблемой и существует ли её решение?


Название: Re: Работа с COM в MTA и QApplication
Отправлено: Johnik от Октябрь 21, 2014, 23:23
какая ось?


Название: Re: Работа с COM в MTA и QApplication
Отправлено: Dolu от Октябрь 22, 2014, 07:41
какая ось?
не принципиально, думаю, что как на NT 5.1 так и на NT 6.3 будет одинаково...


Название: Re: Работа с COM в MTA и QApplication
Отправлено: Johnik от Октябрь 22, 2014, 08:13
думаю, что как на NT 5.1 так и на NT 6.3 будет одинаково...
проверяли?

Работа COM подсистемы во многом отличается в XP с системами выше, в некоторых случаях это связано с DEP.


Название: Re: Работа с COM в MTA и QApplication
Отправлено: Old от Октябрь 22, 2014, 08:20
Сталкивался ли кто с данной проблемой и существует ли её решение?
Попробуйте в других нитках, где будете работать с COM-объектами, в начале выполнять CoInitializeEx( NULL, COINIT_MULTITHREADED ).


Название: Re: Работа с COM в MTA и QApplication
Отправлено: Dolu от Октябрь 22, 2014, 08:37
Попробуйте в других нитках, где будете работать с COM-объектами, в начале выполнять CoInitializeEx( NULL, COINIT_MULTITHREADED ).
Пробовал, нет доступа. :-(
У меня объект существует ещё до создания потоков... и маршалить его ручками в поток не очень хочется...

проверяли?
на XP не проверял, только win7 и 2008r2, одинаково... :-(


Название: Re: Работа с COM в MTA и QApplication
Отправлено: Dolu от Октябрь 22, 2014, 08:45
Единственное, что придумал, это городить два приложения QApplication (UI и логика) и QCoreAplication (обёртка COM), связанные между собой, например, по xml-rpc. (((


Название: Re: Работа с COM в MTA и QApplication
Отправлено: Old от Октябрь 22, 2014, 08:46
Пробовал, нет доступа. :-(
У меня объект существует ещё до создания потоков... и маршалить его ручками в поток не очень хочется...
Да, объекты должны создаваться в самом потоке после вызова инициализации.
А в чем проблема перенести его в отдельный поток. Можно сделать класс-враппер, куда спрятать всю работу с COM.


Название: Re: Работа с COM в MTA и QApplication
Отправлено: Dolu от Октябрь 22, 2014, 09:02
Можно сделать класс-враппер, куда спрятать всю работу с COM.
Так и работаю

А в чем проблема перенести его в отдельный поток.
Есть такой вариант http://www.k-press.ru/cs/2000/4/com_htm/com_1.asp (параграф: "Клиентское приложение 2 – входим в многопоточный мир")
Есть ли материал как это сделать менее болезненно? Средствами Qt а не WinApi?


Название: Re: Работа с COM в MTA и QApplication
Отправлено: Johnik от Октябрь 22, 2014, 09:06
Thread Support in Qt (http://qt-project.org/doc/qt-4.8/threads.html)


Название: Re: Работа с COM в MTA и QApplication
Отправлено: Old от Октябрь 22, 2014, 09:12
Так и работаю
С отдельным потоком внутри? Я вам предлагаю сделать класс, который будет запускать отдельный поток, инициализировать COM, создавать там нужные объекты и их обслуживать.


Название: Re: Работа с COM в MTA и QApplication
Отправлено: Dolu от Октябрь 22, 2014, 10:09
С отдельным потоком внутри? Я вам предлагаю сделать класс, который будет запускать отдельный поток, инициализировать COM, создавать там нужные объекты и их обслуживать.
Такой вариант мне не подходит, т.к. необходимо выполнять работу с COM параллельно (внутри COM обеспечена потокобезопасность)


Название: Re: Работа с COM в MTA и QApplication
Отправлено: Johnik от Октябрь 22, 2014, 10:20
В потоке это и есть параллельно.

Второй вариант: попробуйте отключить DEP. Мне помогло.

Код:
bcdedit.exe /set {current} nx AlwaysOff
Подробнее, например, тут: http://netler.ru/ikt/windows7-dep.htm


Название: Re: Работа с COM в MTA и QApplication
Отправлено: Dolu от Октябрь 22, 2014, 10:31
В потоке это и есть параллельно.
Имелось ввиду работа с одним COM в нескольких потоках конечно.