com线程模型01
Coinitialize;
IUnknown;
apartment;
套间线程;自由线程;
“假定我们需要在后台增大对某个组件的一个计数器,并偶尔需要对显示进行刷新。用一个套间线程而不是工作线程来完成这件事。主线程将创建此套间线程。在套间线程中将创建一个组件并周期性地修改此组件中的计数器。套间线程将给主线程传递一个接口指针,以便主线程可以获得组件当前计数值并将其显示出来。
套间线程将:
》初始化COM库;
》具有一个消息循环;
》对传回给主线程的接口进行调整;
”
《com技术内幕》《com本质论》《COM技术内幕》《深入理解COM+》
-------------------------------------------
随笔分类 -J.COM技术:
http://www.cnblogs.com/Clingingboy/category/198480.html
关于com套间的资料:
目前发现仅此一篇完整,不过国人可笑的是骂的人居多讨论的人却很少
http://www.vckbase.com/document/viewdoc/?id=1597
下面这个帖子的讨论也很精彩
http://topic.csdn.net/t/20021117/21/1184068.html
http://blog.csdn.net/wojiaopanpan/article/details/7574961
com与套间之我见:
http://www.fx114.net/qa-211-55637.aspx
请解释COM中 apartment (套间)的含义 :
http://bbs.csdn.net/topics/20121276
VC知识库:
http://www.vckbase.com/index.php
==================================
midl编译
MIDL编译器 是什么在vs2010什么位置
http://bbs.csdn.net/topics/391840162
===============================================================================
代理存根就像你和你女朋友打电话,你拿着话筒说,她拿着话筒听,说什么不重要!
你拿的话筒相当于代理,她拿的相当于存根,中间的实现过程你不用关心,主要是传输的语音是彼此的就好了!
套间相当于给COM组件加了一个外壳
我们用房子代表套间,人代表COM组件,每个房子里有一台电脑
单线程套间(STA)
这个房子只能容一个人A,这个人使用电脑,可以直接用(线程间在同一个
内存地址,故不用使用代理),应为他在一个房子里。而这个房子外面的
人B(代理),想用他的电脑,必须来敲门,但是由于使用的人多所
以需要排队(隐藏窗的作用先进先出原则)等候,等到轮到他的时候,
A打开门(存根) 让B进去,A就出去了,因为我门假定房子只可以容一个人。
这样就避免了,线程之间的同步交互赛跑问题。
多线程套间(MTA)
就是相当这个房子比较大,房子中有一台电脑,但可以容纳很多人A,B
C,D,E在另一个房子里,C要使用那个房子的电脑,必须和STA一样,
通过存根代理!
但是MTA的问题就出来了,A,B如果抢电脑用,怎么办?
这个就是程序员需要编程控制的事了!
租用线程套间(RTA)
房子是空的,电脑也闲着。
有人想进去,直接进去就可以了,不用使用存根和代理。
但是有人进去了,又有人想去玩电脑。就要在门外面等着里面的老先生
玩爽了,玩够了,出来了,才能进去。这由要使用代理与存根,
但这个仅仅是一个概念,微软只是提了提!!这里你就不用关心了!
-----------
你的比喻还是相当精彩,不过可能有点问题。如你所说,房子代表套间,人代表COM组件对象。“单线程套间(STA)就是 这个房子只能容一个人A”,这应该是你的意思吧?但是STA中应该是能同时存在多个COM对象的。我想是不是应该把“电脑”比作COM对象、“人”比作线程更恰当一些。比如:
单线程套间(STA):这个房子(STA)只能容一个人(套间线程),可以有多台电脑(COM对象)。当然这个人一个时刻只会用一台电脑。房子外面的人(其他套间线程或自由线程)想访问这个房子里的电脑(COM对象),必须要通过这个房子中的人(STA中的套间线程)制定的某些调用规则(消息队列)才行!
--------------------------------
首先我们来考察这样一个问题:如果我们创建了一个COM对象,那么它的实体到底在哪里?简单的说,是在套间(apartment)里面,那么套间又是处于何处呢?我想后一个问题正是我们所困惑的。那么不妨看看这样的一个windows下的事实:我们的程序如果调用了dll,那么dll在哪里?如果多个程序调用了一个dll,那么这个dll在哪里?答案是第一个dll在启动他的程序地址空间里面,后来启动的dll并没有真正的载入,仍然是使用原有的dll,至于如何在不同的进程之间(这通常是程序的最大边界)协调这些东西,这时windows的事情,我们不需要管他。事实上,dll已经处于这样一个地位:一方面它是从属于某一个应用程序的,一方面它又能自由的跨越进程(当然有限制,而且只有系统才能做),这种两重性质,与进程非常不同,我们甚至可以假想它生活在一个独立的空间,谁来它就服务谁--而这正是COM生存的最理想的方式。由此做为类比,我们就不难理解套间的概念了,套间正是这样一个只受系统约束的“独立的空间”,它是COM对象“出生和死亡”的地方,也是应用程序需要COM对象时的访问之所。套间大小可大可小,位置也很随意,大小可以从dll到应用程序,甚至系统全局,位置可以就在dll中(也就是进程中),也可以超乎进程外,甚至跨越系统和网络(DCOM正是如此)。套间因为有了系统的帮助而获得了近乎自由得权利,那么显然应用程序不能按自己的意愿肆意的来访问(不良的操作最多死机,恶意的操作可能就是另外一个CIH了^_^)。怎么访问套间,正是我们需要解决的另一个问题。(此上对于套间其实做了一个简化的概念上的讨论,我觉得对于理解其实应该正好,具体的规范大家参考《COM本质论》吧)
访问套间的方法,就是COM中的接口,也就是说我们只能让用户访问到COM对象的服务功能,而不能让用户访问其私有的数据(通常这就是系统稳定和安全问题的关键所在)。COM的二进制意义上接口已经为我们提供了良好的条件,它能够从一个接口点出发访问到所有,也能从一个传递到另一个,自身(即符合了自反,传递,对称,形成一个闭包)。既然有了一个接口就相当于撬起来了地球,剩下的问题就是,我们需要借助一种什么力量获得这第一个接口呢?谁有这么大的力量呢?我想这个时候,大家都已经知道了,就是windows系统了。系统赋予我们这样的能力,但是也是有限制的:要么在创建COM对象时,通过一个IUnknown接口给我们对象的第一个接口(也就是CoCreateInstance函数里面那最后一个参数了,千万注意哦^_^);另一个方式就是我们的包容在Advise向OLE对象注册自身之后,OLE对象会通过SetSite函数将自身的IUnknown接口通过参数传递过来(Yehh,bingo!)。除此之外,我想除非你和Bill哥哥关系密切,那么也许windows会考虑网开一面的^_^。
有了阿拉丁神灯“IUnknown”,我们就可以根据COM对象的类型来查询其支持的各种各样的接口了。举例子来说,我们可以根据文档(例如MSHTML就有很好的文档支持)得到接口的IID,然后查询,进而得到更多的接口;或者(例如WORD等等不知道IID的)我们可以完全的就通过其IDispatch接口来invoke所有的功能(DISPID可以通过在MFC工程中添加包装类从包装类的实现中得到)。现在,是不是有一些“给我一个接口,我就能驱动地球”的感觉了^_^
com线程模型01的更多相关文章
- servlet的生命周期与运行时的线程模型
第 14 章 生命周期 注意 讲一下servlet的生命周期与运行时的线程模型,对了解servlet的运行原理有所帮助,这样才能避免一些有冲突的设计. 如果你不满足以下任一条件,请继续阅读,否则请跳过 ...
- Linux内核源码分析之调度、内核线程模型 And Centos7.2's Kernel Resource Analysis
本文分为概述.历史.el7.2代码架构图解三部分. 解决的问题: a.Kernel调度发展过程: b.以架构图的方式,详解el7.2具体调度实现.内核线程模型.调度时间片计算,以及探究整个Kernel ...
- COM线程模型 套间概念
COM线程模型 套间概念 1) 单线程套间.线程是COM主线程,初始化COM库的进程的第一个线程.即使从其他线程访问COM组件,也不需要手工同步,COM库已经实现了同步.寓所线程里有个消息处理循环来处 ...
- 看我是如何处理自定义线程模型---java
看过我之前文章的园友可能知道我是做游戏开发,我的很多思路和出发点是按照游戏思路来处理的,所以和web的话可能会有冲突,不相符合. 来说说为啥我要自定义线程模型呢? 按照我做的mmorpg或者mmoar ...
- HBase的Write Ahead Log (WAL) —— 整体架构、线程模型
解决的问题 HBase的Write Ahead Log (WAL)提供了一种高并发.持久化的日志保存与回放机制.每一个业务数据的写入操作(PUT / DELETE)执行前,都会记账在WAL中. 如果出 ...
- Netty学习三:线程模型
1 Proactor和Reactor Proactor和Reactor是两种经典的多路复用I/O模型,主要用于在高并发.高吞吐量的环境中进行I/O处理. I/O多路复用机制都依赖于一个事件分发器,事件 ...
- Mina、Netty、Twisted一起学(十):线程模型
要想开发一个高性能的TCP服务器,熟悉所使用框架的线程模型非常重要.MINA.Netty.Twisted本身都是高性能的网络框架,如果再搭配上高效率的代码,才能实现一个高大上的服务器.但是如果不了解它 ...
- WPF QuickStart系列之线程模型(Thread Model)
这篇博客将介绍WPF中的线程模型. 首先我们先来看一个例子,用来计算一定范围内的素数个数. XAML: <Grid> <Grid.RowDefinitions> <Row ...
- eventloop & actor模式 & Java线程模型演进 & Netty线程模型 总结
eventloop的基本概念可以参考:http://www.ruanyifeng.com/blog/2013/10/event_loop.html Eventloop指的是独立于主线程的一条线程,专门 ...
随机推荐
- ./startup.sh: /bin/sh^M: bad interpreter: 没有那个文件或目录 解决办法
这是因为Linux上 的catalina.sh文件格式给修改了,看不出来,这样就必须通过vim编辑下,变为正常的格式,在catalina.sh的命令模式下输入 ( :set ff=unix ),接着 ...
- Java基础学习-代码块
/*代码块: * 用{}修饰的代码 * 1.局部代码块:控制变量,存在方法中,控制变量的生命周期(作用域) * 2.构造代码块:提取构造方法中的共性,每次创建对象,都会执行,并且在构造方法执行之前执行 ...
- 剑指offer--34.数字在排序数组中出现的次数
时间限制:1秒 空间限制:32768K 热度指数:209611 本题知识点: 数组 题目描述 统计一个数字在排序数组中出现的次数. class Solution { public: int GetNu ...
- L142
keep half an eye on something分神留意splash out随意花钱 大肆挥霍half a mind有想做某事go Dutch v. 各自付帐,打平伙chance in a ...
- QGrapicsItem类
这个类翻译了好久,实在是成员函数太多了,分享出来,希望对大家有用,多多支持哦~~ 详细介绍 QGraphicsItem类是视图框架的一部分,是在一个QGraphicsScene中最基本的图形类,它为绘 ...
- Leetcode22. Generate Parentheses(生成有效的括号组合)
(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/74937307冷血之心的博客) 题目如下:
- golang包快速生成base64验证码
base64Captcha快速生成base64编码图片验证码字符串 支持多种样式,算术,数字,字母,混合模式,语音模式. Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一.Base6 ...
- opencv之图像阈值化处理
一.函数简介 1.threshold-图像简单阈值化处理 函数原型:threshold(src, thresh, maxval, type, dst=None) src:图像矩阵 thresh:阈值 ...
- 重温CLR(八 ) 泛型
熟悉面向对象编程的开发人员都深谙面向对象的好处,其中一个好处是代码重用,它极大提高了开发效率.也就是说,可以派生出一个类,让他继承基类的所有能力.派生类只需要重写虚方法,或添加一些新方法,就可定制派生 ...
- zju 校队选拔 被虐记
选拔已经开始了三天才想起来写游记 QAQ.. 7.12 弱弱的Sky_miner来到了ZJU,过程中被热成狗... 然后见到了无数大二大三的大佬们,过程中被热成狗... 后来听靖哥哥说集训的注意事项, ...