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

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

COM组件的多线程测试-Apartment模型<?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

测试对象

组件对象线程模型为Apartment

组件代码:

STDMETHODIMP CTest2::Test(long nCnt)

{

       printf("/n对象Test2。所在线程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

同步执行

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

从组件的角度看,需要管理线程同步

S3

CoInitializeEx

COINIT_APARTMENTTHREADED

同上

同上

S4

CoInitializeEx

COINIT_MULTITHREADED

顺序执行

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

该线程为系统创建的

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

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

 

多线程中对象实例调用

测试方法:

客户端启动多个线程

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

观察输出结果。

 

测试结果如下:

主线程

COM环境

编号

线程COM

环境

运行结果

NO

T1

NO

无法创建对象

T2

CoInitialize

 

同时调用

每个线程都启动

每个COM对象运行在各自的调用线程中

T3

CoIntializeEx

COINIT_APARTMENTTHREADED

同时调用

每个线程都启动

每个COM对象运行在各自的调用线程中

T4

CoIntializeEx

COINIT_MULTITHREADED

注意:顺序调用

每个线程都启动

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

 

Yes

CoInitialize

T5

NO

无法创建对象

T6

CoInitialize

T2

 

T7

CoIntializeEx

COINIT_APARTMENTTHREADED

T2

T8

CoIntializeEx

COINIT_MULTITHREADED

!!!注意!!!

顺序调用

每个线程都启动

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

 

CoInitializeEx

COINIT_APARTMENTTHREADED

T9

NO

 

T10

CoInitialize

T2

 

T11

CoIntializeEx

COINIT_APARTMENTTHREADED

T2

 

T12

CoIntializeEx

COINIT_MULTITHREADED

T8

 

CoInitializeEx

COINIT_MULTITHREADED

T13

NO

无法

T14

CoInitialize

T2

T15

CoIntializeEx

COINIT_APARTMENTTHREADED

T2

T16

CoIntializeEx

 COINIT_MULTITHREADED

T8

 

输出结果见附录

COM套间和线程模型

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

关于COM及套间(Apartment)知识

什么是COM组件? COM组件是以WIN32动态链接库(DLL)或可执行文件(EXE)形式发布的可执行代码组成。 COM组件是遵循COM规范编写的 COM组件是一些小的二进制可执行文件 ...
  • wojiaopanpan
  • wojiaopanpan
  • 2012年05月17日 09:31
  • 1521

COM的多线程模型

      COM的多线程模型是COM技术里头最难以理解的部分之一,很多书都有涉及但是都没有很好的讲清楚。很多新人都会在这里觉得很迷惑,google大神能搜到一篇vckbase上的文章,但是个人建议还...
  • phil2036
  • phil2036
  • 2009年01月25日 16:05
  • 5881

COM组件的多线程测试-Apartment模型(附录)

对象跨线程调用附录S1忽略S2Main Thread ID:2328ThreadID:2564对象Test2。所在线程ID:2564        线程ID:2564,begin time: 15:4...
  • zzyx
  • zzyx
  • 2003年05月18日 10:26
  • 699

用DELPHI建立多线程COM服务器

用DEL...
  • jian704
  • jian704
  • 2007年09月23日 21:30
  • 1963

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

COM组件的多线程测试-Single模型 版本信息:版本作者修正/记录Ver 1.0Zzyx2003-5-16。创建关键字:COM 多线程 线程模型 single Apartment CoInitia...
  • zzyx
  • zzyx
  • 2003年05月18日 11:05
  • 1299

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

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

使用JS/VBS来测试你的COM组件

        最近又看了一遍去年的这个时候所买的COM类的书籍,对COM有了更深一层的认识。记得去年的这个时候还只知道接口和对象,只知道类型标识符和接口ID,只知道...^.^      前些日子公...
  • sjdev
  • sjdev
  • 2007年07月04日 00:17
  • 3174

COM---多线程

调整 将函数调用的参数从一个进程的地址空间传到另一个进程的地址空间。COM直接使用了Win32线程,但仍有细微差异。Win32线程:用户界面线程、工作线程 COM线程:套间线程(类似于用户界面线程...
  • u012319493
  • u012319493
  • 2017年02月19日 23:59
  • 240

多线程中使用COM组件时的初始化问题

CoInitialize、CoInitializeEx都是windows的API,主要是告诉windows以什么方式为程序创建COM对象,原因是程序调用com库函数(除CoGetMalloc和内存分配...
  • chenlycly
  • chenlycly
  • 2014年10月07日 15:19
  • 4179
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:COM组件的多线程测试-Apartment模型
举报原因:
原因补充:

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