COM组件的多线程测试-Single模型

原创 2003年05月18日 11:05:00

COM组件的多线程测试-Single模型<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

版本信息:

版本

作者

修正/记录

Ver 1.0

Zzyx

2003-5-16。创建

关键字:

COM 多线程 线程模型 single Apartment CoInitialize CoInitializeEx

COINIT_APARTMENTTHREADED COINIT_APARTMENTTHREADED

 

测试对象

组件对象线程模型为Single

组件代码:

STDMETHODIMP CTest1::Test(long nCnt)

{

       printf("/n对象Test1。所在线程ID:%d",GetCurrentThreadId());

       _tzset();

       char tmpbuf[128];

       _strtime( tmpbuf );

    printf( "/n/t线程ID:%d,begin time:/t%s/n", GetCurrentThreadId(),tmpbuf );

       Sleep(1000*nCnt);

       _strtime( tmpbuf );

    printf( "/n/t线程ID:%d,end time:/t%s/n", GetCurrentThreadId(),tmpbuf );

       return S_OK;

}

对象跨线程调用

测试方法:

客户端创建一个对象实例,把该对象的指针传递给多个线程

每个线程中调用该实例的方法

观察输出结果

 

编号

客户端COM环境

结果

心得

S1

NO

无法创建对象

 

S2

CoInitialize

同步执行

且对象的方法被创建的多个线程同步调用

从组件的角度看,需要管理线程同步。尽管组件的线程模型是Single

S3

CoInitializeEx

COINIT_APARTMENTTHREADED

同上

同上

S4

CoInitializeEx

COINIT_MULTITHREADED

顺序执行

对象的方法被同一个线程顺序调用

该线程为系统创建的

COM完成了线程同步的工作。

但如果是不同的方法呢?逻辑上应该也是同步的,未测试

 

 

多线程中对象实例调用

测试方法:

客户端启动多个线程

每个线程创建一个对象实例,调用该对象的方法。

观察输出结果。

 

测试结果如下:

主线程

COM环境

编号

线程COM

环境

运行结果

NO

T1

NO

无法创建对象

T2

CoInitialize

必须

顺序调用

每个线程都启动

第一个线程的对象运行在对应的线程中

第二个线程创建COM对象失败:CreateInstance Failed,-2147221164(没有注册类别)

第三个以及后边的线程的对象都运行在另外的同一个线程中。似乎是系统创建的。

T3

CoIntializeEx

COINIT_APARTMENTTHREADED

顺序调用

每个线程都启动

第一个线程的对象运行在对应的线程中

后边的线程的对象都运行在另外的同一个线程中。似乎是系统创建的。

没有出现过异常

T4

CoIntializeEx

COINIT_MULTITHREADED

顺序调用

每个线程都启动

但对象运行在另外的一个线程中,似乎是系统创建的

没有出现异常

 

CoInitialize

T5

NO

无法创建对象

T6

CoInitialize

???现象同T2

有异常

T7

CoIntializeEx

COINIT_APARTMENTTHREADED

???现象同T2

有异常

T8

CoIntializeEx

COINIT_MULTITHREADED

T4

 

CoInitializeEx

COINIT_APARTMENTTHREADED

T9

NO

无法创建对象

T10

CoInitialize

T2

有异常

T11

CoIntializeEx

COINIT_APARTMENTTHREADED

T2

有异常

T12

CoIntializeEx

COINIT_MULTITHREADED

T4

Yes

CoInitializeEx

COINIT_MULTITHREADED

T13

NO

无法创建对象

T14

CoInitialize

顺序调用

第一个线程创建的COM对象在该线程中运行

其他线程创建的COM对象运行在一个相同的线程中,似乎是系统创建的

没有异常

T15

CoIntializeEx

COINIT_APARTMENTTHREADED

T14

T16

CoIntializeEx

 COINIT_MULTITHREADED

T4

顺序调用

所有线程创建的对象都处于同一个另外的线程中,该线程似乎是由系统创建的

无异常

各个测试输出信息参考附录

COM线程模型 - COM服务端(STA组件)创建线程

当我们在COM组件内部创建线程的时候,又是怎么样的一种情况呢? 这里,我们需要分...
  • zj510
  • zj510
  • 2014年09月15日 11:54
  • 964

COM套间和线程模型

转自http://blog.itpub.net/23410886/viewspace-1032239/ 在看组件的注册表时,对TreadingModel很不理解,所以网上查阅总结了下。大部分...
  • xbgprogrammer
  • xbgprogrammer
  • 2016年08月08日 15:10
  • 393

创建ATL工程及使用C++测试COM组件

VS2010创建ATL工程及使用C++测试COM组件              1.创建ATL项目,取名MyCom 2. ATL 项目向导,勾选 【支持COM+ 1.0】和【支...
  • jiangqin115
  • jiangqin115
  • 2015年09月08日 09:31
  • 771

COM单线程套间详解

作者: Ocean 发表时间: 2010年7月25日 本文链接: http://www.soft-bin.com/html/2010/07/25/com%e5%8d%95%e7%ba%bf%e7%...
  • patdz
  • patdz
  • 2013年01月07日 19:34
  • 2070

COM线程模型详解

http://blog.chinaunix.net/uid-24862988-id-3799415.html         线程模型是一种数学模型,专门针对多线程编程而...
  • weiweixiaopasta
  • weiweixiaopasta
  • 2016年04月07日 10:44
  • 422

C#开发COM组件供其他开发环境或工具调用介绍

由于工作原因涉及到这一块的开发,由于之前并未接触过,所以本篇文章也是在参考了各种资料后,自己实现并通过通过测试之后所整理的备忘录以及一些个人观点。 希望对刚接触这类型开发的朋友有所帮助,若有不足...
  • xiunai78
  • xiunai78
  • 2013年09月10日 11:23
  • 6197

18.可连接对象和连接点原理

讲解可连接对象和连接点原理,说明实现一个可连接对象需要做的事情。
  • wenzhou1219
  • wenzhou1219
  • 2016年07月16日 21:04
  • 733

VS2010创建ATL工程及使用C++测试COM组件

VS2010创建ATL工程及使用C++测试COM组件 2014年09月05日 ⁄ 综合 ⁄ 共 563字 ⁄ 字号 小 中 大 ⁄ 评论关闭 1.创建ATL...
  • Sayesan
  • Sayesan
  • 2015年10月22日 09:37
  • 2475

VC调用COM组件的几种方法

这篇的内容也是我在使用COM组件的时候遇到困难后在网上找的一些调用的方法,以备后用。 1.首先创建一个COM组件:myCom.ocx    组件里面有一个普通接口:ImyCom   一个方法为:Hel...
  • u013823973
  • u013823973
  • 2014年12月26日 14:42
  • 1843

启动COM组件的三种机制

这里的COM组件可以是一个进程内服务器(In-Process Server),也可以是一个进程外服务器(Out-Of-Process Server)。一般情况下,我们在使用这些COM组件的时候,只要保...
  • sunnylion1982
  • sunnylion1982
  • 2013年11月21日 17:24
  • 2080
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:COM组件的多线程测试-Single模型
举报原因:
原因补充:

(最多只允许输入30个字)