【问题标题】:COM event notificationCOM 事件通知
【发布时间】:2009-01-17 23:41:51
【问题描述】:

没有:

  • ATL
  • MFC

注意:

  • 客户端在与服务器线程不同的线程中执行

问题:

  • 一旦从COM对象接收到事件通知,我如何控制客户端的行为 >(服务器)?
  • 如何从客户端实现事件接口?

下图:

hresult = pis8->QueryInterface(
                __uuidof(IConnectionPointContainer),
            (void **) &pContainer);

//result handling omitted


hresult = pContainer->FindConnectionPoint(
                      __uuidof(IS8SimulationEvents),
                      &pConnection);

//result handling omitted

【问题讨论】:

    标签: c++ com


    【解决方案1】:

    客户端实现事件接口 (IS8SimulationEvents) 这可以在单独的组件中,也可以在客户端组件本身上。当组件触发事件时调用实现。

    FindConnectionPoint 之后,客户端调用pConnection->Advise,传递IS8SimulationEvents 并接收“cookie”。 cookie 需要调用Unadvise,必须在清理过程中调用才能断开连接。

    如果客户端运行在与服务器不同的线程中,则客户端需要运行消息循环来接收调用。

    【讨论】:

    • 如何高效地实现消息循环?
    • 看这里:en.wikipedia.org/wiki/Message_loop_in_Microsoft_Windows 你可以通过 PostQuitMessage 退出,或者在循环中添加另一个机制。如果您需要将消息处理与等待事件/类似的事情混合在一起,请在循环中使用 MsgWaitForMultipleObjects/Ex
    【解决方案2】:

    如果我对问题的理解正确,似乎客户端需要运行一个等待循环,例如

    while(!threadCancel)
    {
        DWORD waitResult = WaitForMultipleObjects(actionCount, waitHandles, FALSE, 500);
        switch (waitResult)
        {
            case SERVER_COMMAND_1:
                HandleServerCommand1();
                break;
            ...etc...
            default:
               throw ...
         }
    }
    

    客户端的事件接收器触发等待句柄,有效地允许服务器告诉客户端该做什么。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-18
      • 2016-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多