Здравствуйте john, вы писали:
J>Всем привет! J>Господа помогите разобраться вот с чем... — совсем запутался..
J>Имеем ЕХЕ СОМ — сервер. Применительно ли к нему понятие MTA и STA модели? J>или это все только для ДЛЛ-серверов?
J>Если да (т.е. применимо), то скажите плиз: J>- я понимаю, что если мы имеем клиента для этого СОМ-ЕХЕ сервера и у него J>(клиента) есть несколько потоков (а сервер работает как MTA), то все эти J>вызовы идут к серверу параллельно. J>Объясните тогда вот что... Если имеем сервер (ЕХЕ) работающий одним J>инстансом в системе и к нему 2 СОМ-клиента, то.. вызовы от этих СОМ-клиентов J>будут идти как от разных процессов. И в таком случае они (при MTA работе J>сервера) будут тоже выполнены параллельно или будут выстроены в J>последовательную очередь?
J>Короче меня интересует как организуется очередь вызовов не между потоками, J>а между процессами... в случае MTA и STA модели для ЕХЕ серверов
Я как раз в данный момент делаю что-то похожее, пришлось некоторое время разбираться с потоковыми моделями COM, могу сказать следующее:
— во-первых, нужно различать паралельность доступа к разным объектам и доступ к одному и тому же объекту
из разных потоков (если потоки разделяют между собой указатель на интерфейс реализуемый одним и тем же объектом, в данном случае требуется маршалить этот указатель между потоками, если только они не созданы все в одном МТА-апартменте). Если паралельно выполняются вызовы к разным объектам, то они будут действительно параллельны если объекты созданы либо в МТА либо в разных STA-апартментах. Если паралельно выполняются вызовы к одному объекту, то параллельность будет только в случае МТА. Если же все объекты серевера созданы в одном STA-апартменте, то все вызовы от всех потоков клиента ставятся в очередь и никакой параллельности не будет.
— о том как задать апартмент для серверного объекта: у объектов локального сервера значение ключа ThreadingModel не используется, о том куда они попадут (main STA, STA или МТА) заботится фабрика класса объекта (точнее поток, в котором она работает). Если в потоке, который создает объекты указать CoInitializeEx(NULL, COINIT_MULTITHREADED), то он попадет в МТА-апартмент и создаваемые им объекты — также. По умолчанию (если не ошибаюсь) объекты попадут в main STA-апартмент.
— и наконец о клиенте: насколько я понимаю, в случае локального сервера не имеет практически никакого значения в смысле обеспечения параллельности вызовов куда помещаются потоки клиента: в STA или MTA, все равно объекты сервера попадут в другие апартменты и вызовы к ним будут маршалиться. Пожалуй разница только в том, что в случае МТА не нужно маршалить между потоками общие указатели на интерфейсы, а также при использовании обратных вызовов (от сервера к клиенту).
А еще очень советую прочитать статью "Понимание подразделений COM" на этом сайте — все сразу станет понятно через пару дней после прочтения :)