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 |