Проблема. Почему при создании 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, тогда и жить будет проще, и советчиков найдется море...
Здравствуйте 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:
А>Здраствуйте Kef. Спасибо что позвонили
А>Проблему разрешил самостоятельно. Не вдаваясь в детали RPC, при создании кокласса следует выбрать поточную модель Both и активировать флаг FreeThreadedMarshaller. И тогда все чирикает одновременно.