由于种种原因,在控件中使用了多线程但是当使用子线程Fire事件时遇到了问题.如果控件容器(VB)处理了该事件那么必然会unhandle,而不处理或者在接口调用的地方直接返回事件则没有问题.那么问题是,当我不得不在子线程中触发事件的话,应该如何处理???

解决方案 »

  1.   

    1. Marshall隐藏接口,在接口中fire事件
    2. 向控件的窗口发消息,在消息处理中fire事件
      

  2.   

    我也试过向窗口投递消息来解决,但是问题每次通过AfxGetMainWnd()->GetSaveHwnd()得出的句柄都是空,所以postmessage都无法收到处理.这个窗口问题又如何解决呢?
      

  3.   

    ATL: 要是用Marshal的话简单就简单一点,增加一个接口(A),并在接口里面调用控件的fire event,然后marshal到一个IStream里,做为参数传递给子线程就可以了,子线程收到事件调用A的方法就可以正常fire event了;如果是要用事件,又没有窗口的话,就自己定义一个窗口类的友元,将container设为控件,并将该窗口类的hwnd传给子线程,子线程收到事件,就给这个窗口类发消息,窗口类再个别处理fire event就ok了
    MFC: 直接对控件postmessage就可以了
      

  4.   

    我在ActiveX control test container 测试都可以
    pCtrl->Fire();
    pCtrl->Postmessage();听说在IE中,前者不行,不知道是不是
      

  5.   

    http://support.microsoft.com/kb/q280512/#appliesto
    看看这篇文章,你就知道怎么做了。
    记得,在线程中要调用 HRESULT hRes = CoInitializeEx(NULL, COINIT_MULTITHREADED);。
    ::CoUninitialize ();