Проблема с обработкой событий
От: al_capone  
Дата: 25.02.09 15:02
Оценка:
Добрый вечер.
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 предложения)

Если вам лень объяснять что и почему, буду рад просто ссылке, но именно по теме.
Спасибо за внимание.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.