COM组件的多线程测试-Apartment模型
版本信息:
| 版本 | 作者 | 修正/记录 |
| 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组件的多线程测试,采用Apartment模型。介绍了测试对象,其组件对象线程模型为Apartment。还阐述了两种测试方法,一是对象跨线程调用,客户端创建对象实例并将指针传至多线程;二是多线程中对象实例调用,客户端启动多线程,各线程创建对象实例并调用方法,最后给出测试结果。
1208

被折叠的 条评论
为什么被折叠?



