Однопоточная модель квартиры — как обрабатывать COM-объект, создавая рабочий поток?

У меня есть COM-объект, реализованный в STA EXE (звонки 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();
}
}

Мой тестовый код в основном следует этому шаблону и работает без проблем (пока) но чтение MSDN на STA предполагает, что мне нужно:

  • Вызов CoInitialize/CoUninitialze в ThreadMain
  • Используйте маршаллинг для вызова интерфейса из рабочего потока

Этот вопрос (Как получить доступ к COM-объектам из разных моделей квартир?) также предполагает, что необходима сортировка и выступает за использование GIT.

Однако модели квартир — это одна из частей COM, которую мне никогда не удавалось, и я хотел это проверить. является необходимо в моей ситуации — особенно потому, что в настоящее время он работает нормально, без ошибок — я не хочу добавлять код просто «на случай, если он нужен, я не могу сказать».

Если это имеет какое-либо значение, COM ISomething рассматриваемый объект только вызывается рабочим потоком, а не основным потоком. В моем конкретном случае только один CMyObject будет существовать в любое время.

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …