Название: QAxServer вопрос Отправлено: aleha83 от Сентябрь 25, 2009, 09:25 Народ помогите. не могу разобраться.
Не могу понять в каком потоке создаются объекты моего сервера. Реализовал пару классов пример одного из них class Document : public QObject { Q_OBJECT Q_CLASSINFO("ClassID", "{6D542F09-39A3-4610-8860-A779BD31FEA7}") Q_CLASSINFO("InterfaceID", "{77FF5715-2679-48da-AE17-0EE0CCCEC28E}") // Q_CLASSINFO("RegisterObject", "yes") public: Document(QObject *parent=0); ~Document(); public slots: // значение поля по имени QVariant value(QString name); // добавить элемент void add(QString name, QVariant value); // удалить элемент void del(QString name); // очистить void clear(); // получить весь документ как xml QString getXML(); private: // данные которые хранятся в документе QMap <QString, QVariant> Data; friend class InteractionServer; friend class DocumentList; }; подключаю мой com в тестовой программе на C#. И заметил что когда я вызываю что-то из своего сервера, похоже что выполняется это в главном потоке моего сервера. Т.е. если одновременно несколько клиентских приложений пытаются использовать классы и методы сервера ,то выполняются они нихрена не парраллельно. Пока один не отпустит сервер, другие клиенты тупо виснут и ждут окончания вычислений первого клиента((((, как будто критическая секция (на сервере нету критич. секций) что я не так сделал? Название: Re: QAxServer вопрос Отправлено: aleha83 от Октябрь 06, 2009, 11:56 Разобрался сам.
оказывается QT стартует COM как однопоточный. D:\Qt\2009.01\qt\src\activeqt\control\qaxservermain.cpp HRESULT hRes = CoInitialize(0); что эквивалентно CoInitializeEx(0, COINIT_APARTMENTTHREADED); изменение на CoInitializeEx(0, COINIT_MULTITHREADED); и пересборка qaxserver.lib не помогло. qt стал ругается при создании COM обьектов, что нельзя более 1 application. Отсюда вопрос можно это побороть как-то ? Название: Re: QAxServer вопрос Отправлено: Igors от Октябрь 06, 2009, 12:48 Я побороть не смог, мне это нужно было для QuickTime
CoInitializeEx(0, COINIT_MULTITHREADED); ошибки не выдает, но COM сервис не работает. А CoInitializeEx(0); работает, но application не снимается нормально, приходится убивать (проблема возникает после запуска др. application в котором тоже CoInitializeEx(0)) :'( Правда это было еще на Вындоуз 2000 и без всякого Qt |