2010-02-22 81 views
3

我想创建COM组件,它将经常由Excel应用程序调用(Excel将在其初始化时加载COM),另一个过程(比如说procA)也会发送(与高频率)窗口消息到这个组件。目前我实现了COM作为STA,但是,我经历过,虽然COM忙于处理来自procA的消息,但是excel UI仍然卡住。哪个模型使用STA/MTA

请帮我解决这个问题。我可以创建一个简单的窗口线程来处理来自procA的消息,同时保持COM为STA模型吗?或者我需要将COM作为MTA模型,如果是的话请解释如何处理它。

谢谢

回答

1

移动到MTA要求你执行所有必要的锁定,以保护您的组件的状态。 它将添加线程切换开销,因为Excel的UI在特定线程上运行,这将在调用跨线程到您的组件时阻塞。另一个过程已经引起了跨进程的开销,所以没有真正的改变。

通过将组件模型标记为线程模型'Neutral'—,它仍然可以在任何线程中使用,而不被束缚在MTA中存在(即所有正在进行的调用都将是直接,没有线程旋转)。把它写成免费的线程(所有的锁仍然需要),但只需更改注册。

考虑到确保您的组件是线程安全的所有努力,您可能会发现没有任何优势,除非可以同时对组件进行多个调用。如果你只是在每个方法的持续时间内进行锁定,那么你不会在STA中保存任何内容。更细粒度的锁定可能会带来好处,但您需要更详细地分析可能发生的并发性,然后通过分析来证明您已经能够实现它。看看Amdahl's Law将涵盖这些问题。


这是很简单地把......真实的情况是相当复杂的多。

+0

谢谢你的解释,如果我是正确的,你告诉我必须使用MTA来满足我的要求,Neural模型将是更好的选择。如果我错了,请纠正我。 我不熟悉在COM中创建线程,它只是我们在C++应用程序中使用的窗口线程?请解释或给我一个参考。 我的计划是创建两个线程T1,T2。 T1将处理来自procA的消息并更新全局对象。而且T2也会以Excel查询的形式访问这个全局对象来更新值。所以必须锁定全局对象。这个模型会好吗? – Nimo 2010-02-22 12:42:07

+0

@Nimo:是的:如果你正在考虑线程模型“Free”,那么“Neutral”几乎总是一个更好的选择。通常组件不会自己创建线程(客户端或COM运行时)。如果你需要一个工作线程,你需要确保你完全管理它,不仅仅是为COM初始化它,而且还需要一个线程库旋转线程的所有典型问题(例如处理COM卸载你的DLL)。 – Richard 2010-02-22 14:26:42