<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[Heck's  Blog]]></title> 
<link>https://www.heckjj.com/index.php</link> 
<description><![CDATA[一瞬间的决定，往往可以改变很多，事实上，让自己成功的往往不是知识，是精神！ 如果你总是为自己找借口，那只好让成功推迟。执行力，今天！]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[Heck's  Blog]]></copyright>
<item>
<link>https://www.heckjj.com/post//</link>
<title><![CDATA[全面描述COM对象选择服务器模式]]></title> 
<author>Heck &lt;@hecks.tk&gt;</author>
<category><![CDATA[编程杂谈]]></category>
<pubDate>Wed, 27 Oct 2010 02:40:00 +0000</pubDate> 
<guid>https://www.heckjj.com/post//</guid> 
<description>
<![CDATA[ 
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 微软雅黑;">COM 使用与Win32同样的线程机制。它使用Win32 API来创建和同步线程。但线程模型在Win32和COM中是不尽相同的。<br/><br/>Win32线程模型<br/>&nbsp;&nbsp;&nbsp;&nbsp;Win32 定义了两类线程。用户界面线程和工作者线程。Win32中的每个进程都可以拥有一个或多个用户界面线程和/或多个工作者线程。用户界面线程有消息循环，接受发送到窗口的消息，因此也和一个或多个窗口有关联。工作者线程用于后台处理，不与任何窗口相关联。作为开发者，使用Win32线程时，要注意另外一个主要的不同点。用户界面线程总是拥有一个或多个窗口。当有消息传递给特定的窗口时，用户界面线程负责调用合适的方法。消息循环在同一个用户界面线程中执行，而不理会是哪一个线程发来的消息，所以Windows可以保证同步的正确执行。编程人员不需要为线程同步写附加的特殊代码。然而，如果你开发工作者线程的话，就必须自己处理线程同步，防止死锁或非同步的情况出现。<br/><br/>COM线程模型<br/>&nbsp;&nbsp;&nbsp;&nbsp;在COM中，线程的含义有些微差异。总共有三类COM线程模型。即：Apartment，Free和Rental线程（为MTS引入）。与Win32最类似的是用户界面线程相当于Apartment线程模型，而工作者线程相当于Free线程模型。</span> <span style="font-family: 微软雅黑;"><br/><br/>Apartment 线程模型（单线程Apartment）<br/>&nbsp;&nbsp;&nbsp;&nbsp;此类线程模型在Windows NT3.51和稍后的Windows 95中作为COM的第一个版本引入。Apartment线程模型由一个多线程进程组成，其中每一线程只包括一个COM对象。单线程Apartment（STA）——也表示每个线程只能被一个Apartment调用，每个Apartment都是单线程的。所有的调用都通过Win32消息机制实现。COM保证这些调用的同步。每个线程都有自己的Apartment或者执行关系，在任一时刻只能有一个线程访问这个Apartment。Apartment中的线程只接受来自同一Apartment中其它线程的调用。调用参数需经过Apartment之间的Marshall处理。COM负责在Windows消息机制中处理Apartment间的Marshall过程。 <br/><br/>Free线程模型（多线程Apartment）<br/>&nbsp;&nbsp;&nbsp;&nbsp;此类模型由Windows NT4.0和Windows 95 DCOM引入，允许多个线程访问单个COM对象。使用Free线程的COM对象必须保证线程同步并且实现线程敏感的消息句柄，保证线程安全。调用不能通过Win32消息机制实现，也不能由COM来同步线程，因为同一方法可能在同一时间被多个进程访问。使用Free线程的对象应该能随时处理来自其它线程的方法调用，以及处理来自多线程的同时调用。参数直接传递到任意线程，因为所有的Free线程在同一Apartment中存在。这也称之为多线程Apartment（MTA）。 <br/><br/>Apartment和Free线程模型并存<br/>&nbsp;&nbsp;一个进程可能同时拥有Apartment和Free线程模型。唯一的限制是只可同时拥有一个Free线程模型，但可以有多个单线程Apartment。Apartment之间的指针和数据传递需经过Marshall处理。调用STA中的对象方法将由Win32保证同步，调用MTA中的对象方法则完全不经过同步处理。<br/><br/>Thread Neutral Apartment模型<br/>&nbsp;&nbsp;&nbsp;&nbsp;使用Thread Neutral Apartment（TNA）的组件将自己标记为Free或Both模型。这里组件的实例配合调用者线程而使用调用者线程的模型。COM类对象的实例能在每次被调用时使用不通的线程模型。当线程执行COM对象中的方法，且此方法创建一个新对象时，MTS将暂停当前线程，创建一个新线程来负责对创建对象的处理。和MTA一样，TNA允许多个线程进入一个Apartment。但是，每当一个线程进入Apartment时，将锁定进入的Apartment，仅当退出时才允许其它线程进入。此类线程模型被引进MTS和COM+的原因是保证上下文切换速度。</span><br/>Tags - <a href="https://www.heckjj.com/tags/com%25E5%25AF%25B9%25E8%25B1%25A1/" rel="tag">com对象</a> , <a href="https://www.heckjj.com/tags/%25E6%259C%258D%25E5%258A%25A1%25E5%2599%25A8%25E6%25A8%25A1%25E5%25BC%258F/" rel="tag">服务器模式</a> , <a href="https://www.heckjj.com/tags/free%25E7%25BA%25BF%25E7%25A8%258B%25E6%25A8%25A1%25E5%259E%258B/" rel="tag">free线程模型</a>
]]>
</description>
</item><item>
<link>https://www.heckjj.com/post//#blogcomment</link>
<title><![CDATA[[评论] 全面描述COM对象选择服务器模式]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>https://www.heckjj.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>