Добрый вечер.
Cразу хочу предупредить, что я новичок в com.
Есть ActiveX c ThreadingModel=Apartment. Он может получать данные из сети, а прочитанные данные возвращать через events.
Я написал функцию которую крутит отдельный поток:
int MyClass::grabTh(void* pParam)
{
MyClass* pThis = static_cast<MyClass*>(pParam);
//init COM and ATL
CATLinitializer initObj;
try
{
//instance VWDataAccessCtrl object
IVWDataAccessCtrlPtr pDataAcces(CLSID_VWDataAccessCtrl);
//create and connect event handler to source
CVWEventsProxy eventsProxy(pDataAcces, pThis);
//connecting to host
pDataAcces->put_Url(CComBSTR("192.168.0.6:5002"));
pDataAcces->put_Blocking(FALSE);
HRESULT hr = pDataAcces->Connect();
//TODO: conditional variable wait
MessageBox(0,"mess","mess",0);
pDataAcces->Disconnect();
}
catch (const _com_error& e)
{
}
return 0;
}
тут создается объект COM от которого идут события (VWDataAccessCtrl ), создается объект CVWEventsProxy отнаследованный от IDispEventImpl, и в конструкторе он еще подключается к pDataAcces. Т.е. события должны приходить в eventsProxy.
Я столкнулся с двумя проблемами в этом коде:
1)Когда эта функция один раз отрабатывает, поток уничтожается, когда же я заново создаю поток и выполняется этот код, при инициализации COM (CoInitialize(NULL)) в дебаге выскакивает противный assert вот в этом месте
CAtlModule() throw()
{
// Should have only one instance of a class
// derived from CAtlModule in a project.
ATLASSERT(_pAtlModule == NULL);
после него CoInitialize возвращает S_OK. Соответственно в релизе никаких нареканий в работе нет. Что мне с этим делать?
2)Основная проблема: Если я уберу MessageBox и поставлю sleep, например, или буду делать что то левое, то события не вызываются.Насколько я понял, когда я создаю “STA поток”, то в этом потоке выполняется и обработчик сообщений (оконные сообщения) для обектов com (насколько я понял events вызываются в ответ на сообщения). Когда же я делаю sleep() (или любое другое действие). Поток приостанавливается и обработчик соответственно тоже, поэтому не работает. (не вдумываетесь в последние 2 предложения)
Если вам лень объяснять что и почему, буду рад просто ссылке, но именно по теме.
Спасибо за внимание.