前面一篇文章讲述了STA客户调用STA对象和MTA客户调用STA对象,其实并不难理解。
现在就来讲一下如何把一个COM对象传递到另外一个线程。
先来看看STA套间里面创建STA对象,并且传递到另外一个线程的情况。
STA客户创建STA对象,然后传递到另外一个线程
我们先改一下代码,这段代码很简单,只是修改上个文章里面的客户代码。其实就是主线程创建一个COM对象,然后传递到线程里面,起5个线程。
// TestCom.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <atlbase.h>
#include <thread>
#include <vector>
#include "../MyCom/MyCom_i.h"
#include "../MyCom/MyCom_i.c"
void Test(CComPtr<ICircle>& spCircle)
{
WCHAR temp[100] = { 0 };
swprintf_s(temp, L"STA calling thread (used passed in com object): %d\n", ::GetCurrentThreadId());
OutputDebugStringW(temp);
CoInitialize(NULL);
spCircle->Draw(CComBSTR(L"yellow"));
CoUninitialize();
}
int _tmain(int argc, _TCHAR* argv[])
{
CoInitialize(NULL);
WCHAR temp[100] = { 0 };
swprintf_s(temp, L"Main thread: %d\n", ::GetCurrentThreadId());
OutputDebugStringW(temp);
{
CComPtr<ICircle> spCircle;
spCircle.CoCreateInstance(CLSID_Circle, NULL, CLSCTX_INPROC);
spCircle->Draw(CComBSTR(L"red"));
std::vector<std::thread> vThreads;
for (int i = 0; i < 5; i++)
{
vThreads.push_back(std::thread(Test, spCircle));
}
for (auto& t: vThreads)
{
t.join();
}
}
CoUninitialize();
return 0;
}
运行了一下,得到:
好像每一次COM调用都是在客户线程里面。其实我也不知道为什么会这样,但是我觉得这是不对的,这样做的后果是不可预测的。而且根据STA的定义,STA对象应该是串行化的执行同一