[]
А>Нет, не синглтон. А>Просто вместо CoGetInterfaceAndReleaseStream в другом потоке вызвать CoCreateInstance. Произойдет не тоже самое?
В случае CoGetInterfaceAndReleaseStream создается прокся, которая взаимодействует с уже созданным в другом апартаменте объектом.
В случае CoCreateInstance — создается новый объект. Если его потоковая модель не совместима с текущей — создание произойдет в подходящем апартаменте, а в твоем апартаменте создастся прокся. Только что созданный объект не будет иметь ничего объщего с уже существующим, за исключением поддерживаемых интерфейсов.
В случае синглтона или exe-сервера, зарегистрированного как REGCLS_MULTIPLEUSE — вполне возможно, что получишь тот же самый объект.
Вызов COM-объекта из разных потоков.
От:
Аноним
Дата:
26.06.03 14:29
Оценка:
Есть COM-объект. В одном потоке создаю указатель на него, а использую из других...
Противоречит ли это чему-нибудь?
Т.е. раньше я думал, что в каждом потоке нужно заново указывать в какой тип апартамента нужно войти, получать указатель на COM...
Как весь этот механизм работает в моем случае?
Здравствуйте, Аноним, Вы писали:
А>Есть COM-объект. В одном потоке создаю указатель на него, а использую из других... А>Противоречит ли это чему-нибудь?
Это противоречит COMовскому механизму параллельности. Указатель на COM интерфейс ннадо передавать в другой поток специальным образом, через GIT или через CoMarshalInterThreadInterfaceInStream() / CoGetInterfaceAndReleaseStream().
Опыт — это такая вещь, которая появляется сразу после того, как была нужна...
Здравствуйте, 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 это затормозит работу или нет?
[]
EM>А пофиг COM он умный, он не будет их маршалить, если они в одном апартменте живут.
Ну, это ты погорячился.
Откуда СОМ знает в какой поток ты маршалишь? Грубо говоря, дело обстоит так: в стрим сериализуется информация об объекте включая его потоковую модель. При вызове CoGetInterfaceAndReleaseStream эта информация извлекается и в зависимости от текущего апартамента, создается/не создается прокся.
Так что маршалить все и вся не задумываясь о последствиях — не есть хорошо.
[]
А>А если я вместо 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 из дочерних потоков, т.к. это в несколько раз ускорило работу...
[]
А>Опишу конкретнее ситуацию, Основной поток работает в MTA, он инициализирует COM, этот указатель передается всем остальным потокам, причем, в этих потоках я даже не вызываю CoInitializeEx.
В принципе, зря. Хотя, если не заботит сопровождение и совместимость с будущими версиями операционки — можно.
хъ
А>Остается вопрос — я делаю корректно по отношению к COM?
Что делаешь?
А>Я убрал вызовы CoInitializeEx из дочерних потоков, т.к. это в несколько раз ускорило работу...
Работу чего? Один раз в потоке вызвать функцию CoInitializeEx — не мого времени нужно.
Здравствуйте, Alexey Shirshov, Вы писали:
AS>Здравствуйте, EM, Вы писали:
AS>[]
EM>>А пофиг COM он умный, он не будет их маршалить, если они в одном апартменте живут.
AS>Ну, это ты погорячился.
AS>Откуда СОМ знает в какой поток ты маршалишь? Грубо говоря, дело обстоит так: в стрим сериализуется информация об объекте включая его потоковую модель. При вызове CoGetInterfaceAndReleaseStream эта информация извлекается и в зависимости от текущего апартамента, создается/не создается прокся.
Угу, так и есть. А в чем я погорячился-то ? Я это и имел в виду
AS>Так что маршалить все и вся не задумываясь о последствиях — не есть хорошо.
Хотелось бы поподробнее ознакомиться стем, что именно нельзя делать и о каких последствиях надо задумываться
Опыт — это такая вещь, которая появляется сразу после того, как была нужна...