Re[5]: Вызов COM-объекта из разных потоков.
От: Alexey Shirshov Россия http://wise-orm.com
Дата: 28.06.03 09:16
Оценка: 10 (1)
Здравствуйте, Аноним, Вы писали:

[]

А>Нет, не синглтон.

А>Просто вместо CoGetInterfaceAndReleaseStream в другом потоке вызвать CoCreateInstance. Произойдет не тоже самое?

В случае CoGetInterfaceAndReleaseStream создается прокся, которая взаимодействует с уже созданным в другом апартаменте объектом.
В случае CoCreateInstance — создается новый объект. Если его потоковая модель не совместима с текущей — создание произойдет в подходящем апартаменте, а в твоем апартаменте создастся прокся. Только что созданный объект не будет иметь ничего объщего с уже существующим, за исключением поддерживаемых интерфейсов.

В случае синглтона или exe-сервера, зарегистрированного как REGCLS_MULTIPLEUSE — вполне возможно, что получишь тот же самый объект.
Вызов COM-объекта из разных потоков.
От: Аноним  
Дата: 26.06.03 14:29
Оценка:
Есть COM-объект. В одном потоке создаю указатель на него, а использую из других...
Противоречит ли это чему-нибудь?
Т.е. раньше я думал, что в каждом потоке нужно заново указывать в какой тип апартамента нужно войти, получать указатель на COM...
Как весь этот механизм работает в моем случае?

Спасибо,
Павел.
Re: Вызов COM-объекта из разных потоков.
От: EM Великобритания  
Дата: 26.06.03 14:38
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Есть COM-объект. В одном потоке создаю указатель на него, а использую из других...

А>Противоречит ли это чему-нибудь?

Это противоречит COMовскому механизму параллельности. Указатель на COM интерфейс ннадо передавать в другой поток специальным образом, через GIT или через CoMarshalInterThreadInterfaceInStream() / CoGetInterfaceAndReleaseStream().
Опыт — это такая вещь, которая появляется сразу после того, как была нужна...
Re[2]: Вызов COM-объекта из разных потоков.
От: Alexey Shirshov Россия http://wise-orm.com
Дата: 26.06.03 14:39
Оценка:
Здравствуйте, EM, Вы писали:

[]

А если потоки в MTA?
Re[3]: Вызов COM-объекта из разных потоков.
От: EM Великобритания  
Дата: 26.06.03 14:54
Оценка:
Здравствуйте, Alexey Shirshov, Вы писали:

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


AS>[]


AS>А если потоки в MTA?



А пофиг COM он умный, он не будет их маршалить, если они в одном апартменте живут. Но вопрос — то вроде был про НЕпотокобезопасные компоненты ...
Опыт — это такая вещь, которая появляется сразу после того, как была нужна...
Re[2]: Вызов COM-объекта из разных потоков.
От: Аноним  
Дата: 28.06.03 08:05
Оценка:
Здравствуйте, EM, Вы писали:

EM>Здравствуйте, Аноним, Вы писали:


А>>Есть COM-объект. В одном потоке создаю указатель на него, а использую из других...

А>>Противоречит ли это чему-нибудь?

EM>Это противоречит COMовскому механизму параллельности. Указатель на COM интерфейс ннадо передавать в другой поток специальным образом, через GIT или через CoMarshalInterThreadInterfaceInStream() / CoGetInterfaceAndReleaseStream().


А если я вместо CoMarshalInterThreadInterfaceInStream вызову опять CoCreateInstance это затормозит работу или нет?
Re[4]: Вызов COM-объекта из разных потоков.
От: Alexey Shirshov Россия http://wise-orm.com
Дата: 28.06.03 08:27
Оценка:
Здравствуйте, EM, Вы писали:

[]

EM>А пофиг COM он умный, он не будет их маршалить, если они в одном апартменте живут.


Ну, это ты погорячился.

Откуда СОМ знает в какой поток ты маршалишь? Грубо говоря, дело обстоит так: в стрим сериализуется информация об объекте включая его потоковую модель. При вызове CoGetInterfaceAndReleaseStream эта информация извлекается и в зависимости от текущего апартамента, создается/не создается прокся.
Так что маршалить все и вся не задумываясь о последствиях — не есть хорошо.
Re[3]: Вызов COM-объекта из разных потоков.
От: Alexey Shirshov Россия http://wise-orm.com
Дата: 28.06.03 08:28
Оценка:
Здравствуйте, Аноним, Вы писали:

[]

А>А если я вместо CoMarshalInterThreadInterfaceInStream вызову опять CoCreateInstance это затормозит работу или нет?


У тебя синглтон, что-ли? Если да, то CoMarshalInterThreadInterfaceInStream все-равно по быстрее будет.
Re[4]: Вызов COM-объекта из разных потоков.
От: Аноним  
Дата: 28.06.03 08:40
Оценка:
Здравствуйте, Alexey Shirshov, Вы писали:

AS>Здравствуйте, Аноним, Вы писали:


AS>[]


А>>А если я вместо CoMarshalInterThreadInterfaceInStream вызову опять CoCreateInstance это затормозит работу или нет?


AS>У тебя синглтон, что-ли? Если да, то CoMarshalInterThreadInterfaceInStream все-равно по быстрее будет.


Нет, не синглтон.
Просто вместо CoGetInterfaceAndReleaseStream в другом потоке вызвать CoCreateInstance. Произойдет не тоже самое?
Re: Вызов COM-объекта из разных потоков.
От: Аноним  
Дата: 28.06.03 09:27
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Есть COM-объект. В одном потоке создаю указатель на него, а использую из других...

А>Противоречит ли это чему-нибудь?
А>Т.е. раньше я думал, что в каждом потоке нужно заново указывать в какой тип апартамента нужно войти, получать указатель на COM...
А>Как весь этот механизм работает в моем случае?

А>Спасибо,

А>Павел.

Опишу конкретнее ситуацию, Основной поток работает в MTA, он инициализирует COM, этот указатель передается всем остальным потокам, причем, в этих потоках я даже не вызываю CoInitializeEx.
Но, если я основному потоку укажу STA, то все упадет — понятно.
Остается вопрос — я делаю корректно по отношению к COM?

Я убрал вызовы CoInitializeEx из дочерних потоков, т.к. это в несколько раз ускорило работу...
Re[2]: Вызов COM-объекта из разных потоков.
От: Alexey Shirshov Россия http://wise-orm.com
Дата: 28.06.03 09:59
Оценка:
Здравствуйте, Аноним, Вы писали:

[]

А>Опишу конкретнее ситуацию, Основной поток работает в MTA, он инициализирует COM, этот указатель передается всем остальным потокам, причем, в этих потоках я даже не вызываю CoInitializeEx.


В принципе, зря. Хотя, если не заботит сопровождение и совместимость с будущими версиями операционки — можно.

хъ

А>Остается вопрос — я делаю корректно по отношению к COM?


Что делаешь?

А>Я убрал вызовы CoInitializeEx из дочерних потоков, т.к. это в несколько раз ускорило работу...


Работу чего? Один раз в потоке вызвать функцию CoInitializeEx — не мого времени нужно.
Re[5]: Вызов COM-объекта из разных потоков.
От: EM Великобритания  
Дата: 28.06.03 14:27
Оценка:
Здравствуйте, Alexey Shirshov, Вы писали:

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


AS>[]


EM>>А пофиг COM он умный, он не будет их маршалить, если они в одном апартменте живут.


AS>Ну, это ты погорячился.


AS>Откуда СОМ знает в какой поток ты маршалишь? Грубо говоря, дело обстоит так: в стрим сериализуется информация об объекте включая его потоковую модель. При вызове CoGetInterfaceAndReleaseStream эта информация извлекается и в зависимости от текущего апартамента, создается/не создается прокся.


Угу, так и есть. А в чем я погорячился-то ? Я это и имел в виду

AS>Так что маршалить все и вся не задумываясь о последствиях — не есть хорошо.

Хотелось бы поподробнее ознакомиться стем, что именно нельзя делать и о каких последствиях надо задумываться
Опыт — это такая вещь, которая появляется сразу после того, как была нужна...
Re[5]: Вызов COM-объекта из разных потоков.
От: Tom Россия http://www.RSDN.ru
Дата: 28.06.03 14:46
Оценка:
AS>Так что маршалить все и вся не задумываясь о последствиях — не есть хорошо.
Что вы говорите Аргументы в студию
... << RSDN@Home 1.0 beta 6a >>
Народная мудрось
всем все никому ничего(с).
Re[6]: Вызов COM-объекта из разных потоков.
От: Alexey Shirshov Россия http://wise-orm.com
Дата: 29.06.03 09:41
Оценка:
Здравствуйте, EM, Вы писали:

[]

EM>Угу, так и есть. А в чем я погорячился-то ? Я это и имел в виду


Зачем все это проделывать, если заранее известно, что прокся не нужна?

хъ

EM>Хотелось бы поподробнее ознакомиться стем, что именно нельзя делать и о каких последствиях надо задумываться


Нельзя делать плохих вещей последствиями которых являются ошибки и потеря производительности на пустом месте.
Re[6]: Вызов COM-объекта из разных потоков.
От: Alexey Shirshov Россия http://wise-orm.com
Дата: 29.06.03 09:43
Оценка:
Здравствуйте, Tom, Вы писали:

[]

Tom>Что вы говорите Аргументы в студию


Если у тебя Free/Both/Neutral компонент и потоковая модель клиента MTA — ты хоть раз вспомнишь о CoMarshal...?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.