COM组件的多线程测试-Single模型
2003-05-18 11:05
381 查看
COM组件的多线程测试-Single模型<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
版本信息:
关键字:
COM 多线程 线程模型 single Apartment CoInitialize CoInitializeEx
COINIT_APARTMENTTHREADED COINIT_APARTMENTTHREADED
组件代码:
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;
}
客户端创建一个对象实例,把该对象的指针传递给多个线程
每个线程中调用该实例的方法
观察输出结果
客户端启动多个线程
每个线程创建一个对象实例,调用该对象的方法。
观察输出结果。
测试结果如下:
各个测试输出信息参考附录
版本信息:
版本 | 作者 | 修正/记录 |
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 必须 | 顺序调用 每个线程都启动 第一个线程的对象运行在对应的线程中 第二个线程创建CO ed61 M对象失败: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 顺序调用 所有线程创建的对象都处于同一个另外的线程中,该线程似乎是由系统创建的 无异常 |
相关文章推荐
- 谁来关心我们这些程序员
- 千年零一虫
- 独具量身定做特色的管理软件--数据大师
- 解析IP地址为主机域名
- 将某一主机域名解析为IP地址
- 怎样为任何控件和区域添加提示信息:用自己封装的CTip类
- 利用pre-compiled headers技术以加速编译速度--以Borland C++ Builder为例(四)
- 利用pre-compiled headers技术以加速编译速度--以Borland C++ Builder为例(二)
- 调试利器-----------------------DebugTrace for Windows简介
- COM组件的多线程测试-Apartment模型(附录)
- COM组件的多线程测试-Single模型(附录)
- Internet浏览提速技巧
- 编程的思考
- 我的程序观
- 我身在哪里,将走向何处?
- 《Patterns of Enterprise Application Architecture 》编译版(中文) 之 序言
- 视图绘画机理
- 基于UML的信息系统分析与设计
- HP LoadRunner 9.5使用手记
- linux网络编程----->高并发--->多线程并发服务器