Особенности многопоточной обработки в COM
От: igdrassile  
Дата: 22.04.02 12:20
Оценка:
Проблема. Почему при создании exe сервера с Threading Model = Free. Вызовы клиентов выстраиваются в очередь как при апартаментной модели, или что-то не так делаем?
Эксперимент. Создали exe-сервер в MS Visual Studio Net как MFC-application. Создали COM-объект, поточную модель обозначили как free. Создали единственную функцию touch(LONG period), которая просто ждет period миллисекунд.
Создали клиента как MFC-application. в клиенте создали 2 потока в каждом из которых вызываем CoinitializeEx(NULL, COINIT_MULTITHREADED). создаем COM-объект как локальный сервер, вызываем функцию touch, отмечаем время входа и время выхода, получается, что пока один поток не выйдет из touch второй туда не зайдет.
Re: Особенности многопоточной обработки в COM
От: Аноним  
Дата: 22.04.02 14:53
Оценка:
Здравствуйте igdrassile, Вы писали:

I>Проблема. Почему при создании exe сервера с Threading Model = Free.


Серевер не может быть "Threading Model", это атрибут объекта. Если сервер EXE-шный, то типом апартамената будет упралять код, но сам сервер в принципе может создавать объекты любого типа.

I>exe-сервер ... как MFC-application.


Я бы очень посоветовал забыть о MFC если речь идет о серверном приложении. Переделай его на ATL, тогда и жить будет проще, и советчиков найдется море...
Re: Особенности многопоточной обработки в COM
От: Kef Россия  
Дата: 24.04.02 07:14
Оценка:
Здравствуйте igdrassile, Вы писали:

I>Проблема. Почему при создании exe сервера с Threading Model = Free. Вызовы клиентов выстраиваются в очередь как при апартаментной модели, или что-то не так делаем?

I>Эксперимент. Создали exe-сервер в MS Visual Studio Net как MFC-application. Создали COM-объект, поточную модель обозначили как free. Создали единственную функцию touch(LONG period), которая просто ждет period миллисекунд.
I>Создали клиента как MFC-application. в клиенте создали 2 потока в каждом из которых вызываем CoinitializeEx(NULL, COINIT_MULTITHREADED). создаем COM-объект как локальный сервер, вызываем функцию touch, отмечаем время входа и время выхода, получается, что пока один поток не выйдет из touch второй туда не зайдет.

... Попробую объяснить, как мне однажды объяснили.

В твоем случае, на сколько я понял, у тебя один COM объект, поддерживающий один интерефейс, в котором определен ОДИН метод, в данном случае touch(). В каждом из двух потоков своего клиента ты вызываешь этот один единтсвенный метод. Вроде так понял. И получается что потоки жду ...

... Возможно проблема в следующем: Твой объект поддерживает модель MTA. Когда приходит запрос на вызов метода Touch от первого потока клиента к серверу, библиотека COM на стороне сервера берет один поток из пула RPC и в этом потоке выполняет метод COM объекта Touch. Пока этот метод выполняется, второй поток в клиенте БУДЕТ ждать своей очереди, поскольку обращается к тому же методу, что и первый. Как только первый поток получит управление от Touch, ситуация, описаная выше с выполнением метода, повторится со вторым потоком.

... Насколько я понял суть MTA модели для COM объектов, это то, что клиенты объекта одновременно могу вызывать РАЗНЫЕ методы интерефейсов, но не одни и те же (как в товем случае).

... Я в своих словах не уверен на 100% ... Так что стоит проверить.

... Можешь провести эксперимент: Добавь второй метод, Touch2 например, и во втором потоке вызывай его. Скорее всего, в этом случае вызовы будут почти одновременными (на сколько точным является слово "одновременный").
Re[2]: Особенности многопоточной обработки в COM
От: Аноним  
Дата: 24.04.02 08:27
Оценка:
Здравствуйте Kef, Вы писали:

Kef>Здравствуйте igdrassile, Вы писали:


I>>Проблема. Почему при создании exe сервера с Threading Model = Free. Вызовы клиентов выстраиваются в очередь как при апартаментной модели, или что-то не так делаем?

I>>Эксперимент. Создали exe-сервер в MS Visual Studio Net как MFC-application. Создали COM-объект, поточную модель обозначили как free. Создали единственную функцию touch(LONG period), которая просто ждет period миллисекунд.
I>>Создали клиента как MFC-application. в клиенте создали 2 потока в каждом из которых вызываем CoinitializeEx(NULL, COINIT_MULTITHREADED). создаем COM-объект как локальный сервер, вызываем функцию touch, отмечаем время входа и время выхода, получается, что пока один поток не выйдет из touch второй туда не зайдет. :shuffle:

Kef>... Попробую объяснить, как мне однажды объяснили.


Kef>В твоем случае, на сколько я понял, у тебя один COM объект, поддерживающий один интерефейс, в котором определен ОДИН метод, в данном случае touch(). В каждом из двух потоков своего клиента ты вызываешь этот один единтсвенный метод. Вроде так понял. И получается что потоки жду ...


Kef>... Возможно проблема в следующем: Твой объект поддерживает модель MTA. Когда приходит запрос на вызов метода Touch от первого потока клиента к серверу, библиотека COM на стороне сервера берет один поток из пула RPC и в этом потоке выполняет метод COM объекта Touch. Пока этот метод выполняется, второй поток в клиенте БУДЕТ ждать своей очереди, поскольку обращается к тому же методу, что и первый. Как только первый поток получит управление от Touch, ситуация, описаная выше с выполнением метода, повторится со вторым потоком.


Kef>... Насколько я понял суть MTA модели для COM объектов, это то, что клиенты объекта одновременно могу вызывать РАЗНЫЕ методы интерефейсов, но не одни и те же (как в товем случае).


Kef>... Я в своих словах не уверен на 100% ... Так что стоит проверить.


Kef>... Можешь провести эксперимент: Добавь второй метод, Touch2 например, и во втором потоке вызывай его. Скорее всего, в этом случае вызовы будут почти одновременными (на сколько точным является слово "одновременный").


Здраствуйте Kef. Спасибо что позвонили

Проблему разрешил самостоятельно. Не вдаваясь в детали RPC, при создании кокласса следует выбрать поточную модель Both и активировать флаг FreeThreadedMarshaller. И тогда все чирикает одновременно. :maniac:
Re[3]: Особенности многопоточной обработки в COM
От: Kef Россия  
Дата: 24.04.02 23:19
Оценка:
А>Здраствуйте Kef. Спасибо что позвонили

А>Проблему разрешил самостоятельно. Не вдаваясь в детали RPC, при создании кокласса следует выбрать поточную модель Both и активировать флаг FreeThreadedMarshaller. И тогда все чирикает одновременно.


Отлично, тогда желаю успехов ...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.