ATL COM:执行回调时返回的函数

时间:2013-07-04 11:57:21

标签: c++ multithreading com mfc callback

背景:

我正在为现有的旧版C ++ MFC应用程序实现COM接口。应用程序是多线程的,使用一个用于COM / GUI的线程(主线程)和一个用于来自C库的传入事件。 COM接口反映了用户可以使用GUI进行的交互。

编辑:COM服务器是“进程外”,即COM由MFC应用程序实现。

问题描述:

COM接口具有在树视图控制器中选择对象的功能。当选择一个对象时,用户可以调用将使用该对象执行不同功能的COM函数。

示例1 - 用户看到/感受到的内容:

  1. 使用COM接口中的函数Y在树视图中选择对象X.
  2. X在GUI中突出显示,函数Y返回。
  3. 用户调用将删除对象X的函数Z。
  4. 编写MFC应用程序,使得模型多次与GUI回调函数紧密耦合,原因各种各样。对于SelectObject函数,这意味着在完全执行回调函数之前,不会在树视图中真正选择对象。这意味着实例1看起来更像是:

    示例2 - 真正发生的事情:

    1. 使用COM接口中的函数Y在树视图中选择对象X.
    2. 功能Y设置要选择的对象X,Y返回。
    3. 调用树视图项的回调函数(可能是OnSelChanged())并更新所有GUI元素和应用程序模型以选择X.
    4. 用户调用将删除对象X的函数Z。
    5. 如果使用正常的GUI交互,这对用户来说不是问题;在用户在树视图中选择对象X之后,在很短的时间内调用回调函数,因此函数Z将删除对象X.

      使用COM接口时,这就成了问题。当函数Y返回时,用户可以选择立即调用函数Z.如果调用了回调函数,则对象X将被删除,否则将发生意外行为。

      这是不受欢迎的行为。像SelectObject这样的函数向用户指示当函数执行完毕后,应该选择一个对象而不需要额外的等待。

      解决方案的想法

      我一直试图找出解决这个问题的方法,并提出了一些可能的想法:

      1. 回调完成后发送事件
        • 这是不需要的,因为我仍然认为当完成函数SelectObject时,用户应该期望选择对象X,用户不必等待。
      2. 重写并分离GUI和模型。
        • 我想要的东西,但没有时间。 GUI更新的方式与应用程序中的其他所有内容非常相关,需要进行大量更改。
      3. 让COM和GUI在单独的线程上运行。
        • 这个很有意思。我不知道是否可能;我没有找到任何可能存在这种分离的信息。似乎COM被锁定只在主线程上工作。
      4. 3号很有意思但我缺乏知识。有没有人遇到过他们解决过的类似问题?我真的很想帮助解决这个问题:)

0 个答案:

没有答案