2010-08-11 75 views
2

我们在线程模型“Both”中给出了in-proc-server(.dll).i注意到了注册表编辑器中的线程模型。我们知道com对象用“Both”创建的线程将采用创建对象的线程的线程模型。我实例化STA线程中的对象,以确保调用com对象应该只经过一个线程。我是以串行化方式从子线程调用此对象的方法,其中对象实际上是在主(STA)线程中创建的。它是否需要编组支持线程模型的COM对象“Both”

它会产生任何副作用吗?

我没有得到任何错误,并执行正常,当我在没有任何编组(GIT)的子线程中使用该对象。

现在我的疑问是如何发生它。我没有得到任何staright方式回答这个,当我谷歌。请给我一个简要说明这个

根据我的理解,对象的编组是如果对象支持“STA”是需要吗?这里我们的对象支持“Both”。

+0

您真的在问为什么Google无法帮您找到答案吗?奇怪的。 – 2010-08-11 17:13:19

+0

我不是说那个..我只是想知道我做的方式是正确的吗?我对com编程非常陌生,因此我在此处发布确认信息 – Sukumar 2010-08-12 05:38:31

回答

2

请参阅this very good explanation。是否使用编组将取决于对象和呼叫者是否在同一个房间中。如果我把你的话给对了,你可以打电话给CoInitializeEx()把一个线程放到STA中,然后你从这个线程调用CoCreateInstance() - 对象将在同一个STA中创建,所以原来的创建者线程将直接与它通信。另一个线程如何使用该对象将取决于公寓的配置。你的问题还不清楚,另一个线程调用CoInitializeEx()以及对象指针是如何传递给它的。如果你只是传递一个原始指针,那么就没有办法打开编组。

当您将指针传递给另一个线程时,可能会遇到实际问题。 Part two of the above article你不应该通过公寓之间的原始指针。不过看起来你的情况是该规则的一个例外。 COM类被标记为具有线程模型Both,所以它必须是完全线程安全的,因此可以从多个线程同时调用它的方法。我不确定这一点,但看起来你很安全。

+0

>是否使用编组将取决于对象和呼叫者是否在同一间公寓<<<<<< 在我们的使用CoinitializeEx(NULL,COINIT_APARTMENTTHREADED)在主线程中创建案例对象,并且使用对象方法将在没有任何编组的情况下从子线程发生。子线程使用CoinitializeEx初始化(NULL,COINIT_MULTITHREADED),因此主线程的并发模型为STA对于子线程是MTA。即使没有初始化库,我也能够从子线程执行该方法。 – Sukumar 2010-08-12 06:22:45

+0

@Sukumar:如果你只是传递一个原始指针,编组就不会进入。你如何将对象指针传递给另一个线程? – sharptooth 2010-08-12 06:30:09

+0

我正在创建一个COM对象作为类的成员并将此类实例传递给子线程。从子线程线程我将通过主类的实例访问com对象 – Sukumar 2010-08-12 06:43:08

0

是的,因为你正在一个房间中创建一个对象,并在另一个房间中调用方法。您尚未遇到任何副作用。我认为是因为你的对象很简单(没有回调,连接点等)。但它可能会改变。