您的位置:首页 > 其它

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

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

 

版本信息:

版本
作者
修正/记录
Ver 1.0Zzyx2003-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环境
结果
心得
S1NO无法创建对象 
S2CoInitialize同步执行
且对象的方法被创建的多个线程同步调用
从组件的角度看,需要管理线程同步。尽管组件的线程模型是Single
S3CoInitializeEx
COINIT_APARTMENTTHREADED
同上同上
S4CoInitializeEx
COINIT_MULTITHREADED
顺序执行
对象的方法被同一个线程顺序调用
该线程为系统创建的
COM完成了线程同步的工作。
但如果是不同的方法呢?逻辑上应该也是同步的,未测试
 

 

多线程中对象实例调用

测试方法:
客户端启动多个线程
每个线程创建一个对象实例,调用该对象的方法。
观察输出结果。
 

测试结果如下:

主线程

COM环境
编号
线程COM

环境
运行结果
NOT1NO无法创建对象
T2CoInitialize
必须
顺序调用
每个线程都启动
第一个线程的对象运行在对应的线程中
第二个线程创建CO
ed61
M对象失败:CreateInstance Failed,-2147221164(没有注册类别)
第三个以及后边的线程的对象都运行在另外的同一个线程中。似乎是系统创建的。
T3CoIntializeEx
COINIT_APARTMENTTHREADED
顺序调用
每个线程都启动
第一个线程的对象运行在对应的线程中
后边的线程的对象都运行在另外的同一个线程中。似乎是系统创建的。
没有出现过异常
T4CoIntializeEx
COINIT_MULTITHREADED
顺序调用
每个线程都启动
但对象运行在另外的一个线程中,似乎是系统创建的
没有出现异常
 

CoInitialize
T5NO无法创建对象
T6CoInitialize???现象同T2
有异常
T7CoIntializeEx
COINIT_APARTMENTTHREADED
???现象同T2
有异常
T8CoIntializeEx
COINIT_MULTITHREADED
同T4
 

CoInitializeEx
COINIT_APARTMENTTHREADED
T9NO无法创建对象
T10CoInitialize同T2
有异常
T11CoIntializeEx
COINIT_APARTMENTTHREADED
同T2
有异常
T12CoIntializeEx
COINIT_MULTITHREADED
同T4
Yes
CoInitializeEx
COINIT_MULTITHREADED
T13NO无法创建对象
T14CoInitialize顺序调用
第一个线程创建的COM对象在该线程中运行
其他线程创建的COM对象运行在一个相同的线程中,似乎是系统创建的
没有异常
T15CoIntializeEx
COINIT_APARTMENTTHREADED
同T14
T16CoIntializeEx
 COINIT_MULTITHREADED
同T4
顺序调用
所有线程创建的对象都处于同一个另外的线程中,该线程似乎是由系统创建的
无异常
各个测试输出信息参考附录
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  多线程 测试 工作