Russian Qt Forum
Май 16, 2024, 10:00 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QAxServer вопрос  (Прочитано 5666 раз)
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#. И заметил что когда я вызываю что-то из
своего сервера, похоже что выполняется это в главном потоке моего сервера.
Т.е. если одновременно несколько клиентских приложений пытаются использовать классы и методы сервера ,то выполняются они нихрена не парраллельно. Пока один не отпустит сервер, другие клиенты тупо виснут и ждут окончания вычислений первого клиента((((, как будто критическая секция (на сервере нету критич. секций)

что я не так сделал?
Записан
aleha83
Гость
« Ответ #1 : Октябрь 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.

Отсюда вопрос можно это побороть как-то ?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Октябрь 06, 2009, 12:48 »

Я побороть не смог, мне это нужно было для QuickTime

CoInitializeEx(0, COINIT_MULTITHREADED); ошибки не выдает, но COM сервис не работает. А CoInitializeEx(0); работает, но application не снимается нормально, приходится убивать (проблема возникает после запуска др. application в котором тоже CoInitializeEx(0))  Плачущий

Правда это было еще на Вындоуз 2000 и без всякого Qt
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.08 секунд. Запросов: 22.