C++ 单线程单元模型-如何处理创建工作线程的COM对象?

C++ 单线程单元模型-如何处理创建工作线程的COM对象?,c++,com,apartments,C++,Com,Apartments,我在STA EXE中实现了一个COM对象(调用CoInitialize(NULL)),让我们称它为CMyObject,它实现了IControl。伪代码如下所示: IControl { Start(); Stop(); }; CMyClass : IControl { public: Start() { //create an ISomething in the main thread mSomething = CoCreate(ISomething); //th

我在STA EXE中实现了一个COM对象(调用
CoInitialize(NULL)
),让我们称它为
CMyObject
,它实现了
IControl
。伪代码如下所示:

IControl
{
 Start();
 Stop();
};

CMyClass : IControl
{
 public:
  Start()
  {
   //create an ISomething in the main thread
   mSomething = CoCreate(ISomething);
   //this thread will make a call through ISomething
   mThread = std::thread(ThreadMain, this);
  }
  Stop()
  {
   kill(mThread);
   mSomething->Release();
  }

  UseSomething() //called from another thread
  {
   mSomething->DoStuff();
  }
 private:
  std::thread mThread;
  ISomething *mSomething;
};

void ThreadMain(CMyClass *o)
{
 for(;;)
 {
  if(<some condition>)
   o->UseSomething();
 }
}
i控件
{
Start();
停止();
};
CMyClass:IControl
{
公众:
开始()
{
//在主线程中创建一个等距对象
mSomething=CoCreate(ISomething);
//此线程将通过ISomething进行调用
mThread=std::thread(ThreadMain,this);
}
停止()
{
kill(mThread);
mSomething->Release();
}
UseSomething()//从另一个线程调用
{
mSomething->DoStuff();
}
私人:
std::线程mThread;
一件事;一件事;
};
空螺纹干管(CMyClass*o)
{
对于(;;)
{
if()
o->使用某物();
}
}
我的测试代码基本上遵循这种模式,并且工作没有问题(到目前为止),但阅读表明我需要:

  • ThreadMain
  • 使用封送处理从工作线程调用接口
这个问题()还建议需要编组,并提倡使用GIT

然而,公寓模型是COM的一部分,我从来没有真正尝试过,我想检查一下这在我的情况下是必要的——特别是因为它目前运行良好,没有抛出错误——我不想添加代码只是“万一需要,我说不出来”


如果有任何区别,那么讨论中的COM
ISomething
对象只由工作线程调用,而不是由主线程调用。在我的特定情况下,任何时候都只会存在一个
CMyObject

我希望线程函数的调用会失败,因为没有调用
contialize
。它们成功了吗?您违反了COM线程模型规则。基本上,您并不是真正在做COM—您有一个指向对象的直接指针,您将该指针传递给另一个线程,然后在一个不保证线程安全的对象上从该线程调用方法。COM运行时不在图片中,无法阻止您。你可能会或可能无法逃脱,这取决于你所调用的对象到底是怎么做的。@ IGORANTDENIK我确实考虑过,但它看起来有点笨拙——基本上是我的线程中的C程序。不过,这可能是一种选择。顺便说一句,如果你想把它们组合成一个,我认为你的评论是相当连贯的答案。要知道,如果你在一个STA线程上创建一个对象,然后将它封送到另一个线程,那么另一个线程得到的是一个代理。对该代理的每次调用都被封送回原始线程,在那里执行,结果发送回工作线程(请记住,您创建的对象可能是线程仿射的,因此COM必须确保仅在创建它的线程上调用它)。在这个场景中,“worker”实际上不做任何工作——它只是坐在那里等待主线程完成out-of-family-COM调用。这听起来不像你想的那样。顺便说一句,我见过的COM线程模型。