com线程模型实验
创建一个对话框应用程序进行测试
主线程代码
CoInitialize( NULL);
{
CString str;
str.Format(L"threadid:%d ,msg:%d", GetCurrentThreadId(), GetCurrentThreadId());
MessageBox( str, str, MB_OK);
ITestShowMsgPtr ptrMsg;
HRESULT hr = ptrMsg.CreateInstance( __uuidof(TestShowMsg));
ptrMsg->ShowMsg( _bstr_t(L"My Message"));
}
_beginthreadex( NULL, 0, _ThreadShowMessage, NULL, 0, NULL);
另外一个线程代码
UINT __stdcall _ThreadShowMessage( LPVOID pParam)
{
CString str;
str.Format(L"threadid:%d ,msg:%d", GetCurrentThreadId(), GetCurrentThreadId());
MessageBox(NULL, str, str, MB_OK);
CoInitialize( NULL);
ITestShowMsgPtr ptrMsg;
HRESULT hr = ptrMsg.CreateInstance( __uuidof(TestShowMsg));
ptrMsg->ShowMsg( _bstr_t(L"My Message"));
return 0;
}
COM类型为Apartment
-------------------------------------------------------------------------------------
第一种情况 线程1使用CoInitialize( NULL),线程2使用CoInitialize( NULL)初始化主线程套件,COM类型为单元。
执行结果:线程1ID:1,线程1调用COM接口执行的线程ID:1,线程2的ID:2,线程2调用COM接口执行的线程ID:2
第二种情况 线程1使用CoInitializeEx(NULL, COINIT_MULTITHREADED),线程2使用CoInitialize( NULL)初始化主线程套件,COM类型为单元。
执行结果:线程1ID:1,线程1调用COM接口执行的线程ID:2,线程2的ID:3,线程2调用COM接口执行的线程ID:3
第三种情况 线程1使用CoInitializeEx(NULL, COINIT_MULTITHREADED),线程2使用CoInitializeEx(NULL, COINIT_MULTITHREADED)初始化主线程套件,COM类型为单元。
执行结果:线程1ID:1,线程1调用COM接口执行的线程ID:2,线程2的ID:3,线程2调用COM接口执行的线程ID:2
COM类型为Single
-------------------------------------------------------------------------------------
第一种情况 线程1使用CoInitialize( NULL),线程2使用CoInitialize( NULL)初始化主线程套件,COM类型为单元。
执行结果:线程1ID:1,线程1调用COM接口执行的线程ID:1,线程2的ID:2,线程2调用COM接口执行的线程ID:1
第二种情况 线程1使用CoInitializeEx(NULL, COINIT_MULTITHREADED),线程2使用CoInitialize( NULL)初始化主线程套件,COM类型为单元。
执行结果:线程1ID:1,线程1调用COM接口执行的线程ID:2,线程2的ID:3,线程2调用COM接口执行的线程ID:2
第三种情况 线程1使用CoInitializeEx(NULL, COINIT_MULTITHREADED),线程2使用CoInitializeEx(NULL, COINIT_MULTITHREADED)初始化主线程套件,COM类型为单元。
执行结果:线程1ID:1,线程1调用COM接口执行的线程ID:2,线程2的ID:3,线程2调用COM接口执行的线程ID:2
COM类型为Free
-------------------------------------------------------------------------------------
第一种情况 线程1使用CoInitialize( NULL),线程2使用CoInitialize( NULL)初始化主线程套件,COM类型为单元。
执行结果:线程1ID:1,线程1调用COM接口执行的线程ID:2,线程2的ID:3,线程2调用COM接口执行的线程ID:2
第二种情况 线程1使用CoInitializeEx(NULL, COINIT_MULTITHREADED),线程2使用CoInitialize( NULL)初始化主线程套件,COM类型为单元。
执行结果:线程1ID:1,线程1调用COM接口执行的线程ID:1,线程2的ID:2,线程2调用COM接口执行的线程ID:3
第三种情况 线程1使用CoInitializeEx(NULL, COINIT_MULTITHREADED),线程2使用CoInitializeEx(NULL, COINIT_MULTITHREADED)初始化主线程套件,COM类型为单元。
执行结果:线程1ID:1,线程1调用COM接口执行的线程ID:1,线程2的ID:2,线程2调用COM接口执行的线程ID:2
待续。。。