none
请教:关于COM组件中的工作线程 RRS feed

  • 问题

  • 某COM组件CA实现了IA接口,同时该组件聚合了IB接口(IB接口的ThreadingModal有可能不同于IA接口的ThreadingModal)。

    IB接口有一个IB_Func1函数。IA接口有一个函数IA_Func1,CA的实现如下:

    class CA
    
    {
    
    //... 
    
    void CA_Method1();
    
    private:
    
    long m_nValue;
    
    IB *m_pIB;
    
    };
    
    HRESULT CA::IA_Func1()
    
    {
    
    CreateThread(NULL,0,threadProc,this,0,NULL);
    
    return S_OK;
    
    }
    
    unsigned long CA::threadProc(LPVOID param)
    
    {
    
    CA *pCA = (CA*)param;		//这个转换不确定是否能成功(STA、MTA、DCOM远程组件)
    
    pCA->CA_Method1();		//由于上面的不确定,这里也不确定是否能成功调用
    
    InterlockedIncreament(&pCA->m_nValue);		//同上
    
    pCA->m_pIB->IB_Func1();	//这个就更悬了
    
    return 0;
    
    }

     

    这样能在各种环境(STA/MTA)下正确运行吗?

    如果不能的话,注释掉CA->m_pIB->IB_Func1();之后是否能在各种环境(STA/MTA)下成功运行呢?

    IA的ThreadingModal对上述两个问题的答案有影响吗?

     

    困扰很久了,一直无法确定答案。

    如果不行的话:由于IA_Func1是个很耗时的操作,所以必须开启工作线程。在工作线程中如何才能安全的访问到IB接口(CA组件聚合的)以及CA类的辅助函数呢?


    MaRs``
    2010年6月13日 11:28

全部回复

  • 首先需要把你的线程初始化线程模型。初始化后,MTA可以保证正确运行。STA可以运行,但是运行的线程是当前线程。由于STA有自己的消息窗口,所以这样调用不保证同步。
    麻烦把正确答案设为解答。
    2010年6月15日 1:28
    版主
  • 谢谢!但是您好像没有正面解开我的疑问,还是不明白。

    IA接口的IA_Func1创建了一个线程,在线程中将IA_Func1传入的this指针强制转换为IA实现类的指针是否安全?

     

    我想,如果IA接口创建在符合其套间要求的套间内时,这个转换应该是可以成功的,但是这个我不能确定

    如果IA接口被列集到其他线程并散集后再调用其IA_Func1,能不能成功我就更不清楚了,因为在IA_Func1里面不仅访问了CA类的类变量,还访问了CA类内嵌的IB接口的函数,而CA::m_pIB本身有可能也是一个经过列集散集后得到的指针。

     

    还是继续请高手解惑,谢谢!


    MaRs``
    2010年6月15日 3:04