代码之家  ›  专栏  ›  技术社区  ›  Patrick

保持用户界面最新的最佳方法是什么?

  •  2
  • Patrick  · 技术社区  · 15 年前

    这个问题是对我问题的改进 Different ways of observing data changes

    在我的C++应用程序中,我仍然有很多类,这些类在复杂的数学例程和复杂的业务逻辑中经常被更新(或者可以被更新)。

    如果我采用“观察者”方法,并且每次实例的值发生更改时都发送通知,那么我有两大风险:

    • 发送通知本身可能会严重降低应用程序的速度

    有些问题可以通过添加缓冲机制来解决(当您准备开始一个算法时,以及当算法完成时,您可以发送通知),但是由于业务逻辑可能在软件的许多地方执行,因此在菜单中选择的每一个可能的操作之后,我们几乎可以在所有地方添加缓冲。

    同样,业务逻辑可能从应用程序中的任何地方执行,因此在实践中,我们可能必须在用户执行的几乎每个操作之后添加一个额外的调用(告诉所有窗口应该更新自己)。

    • 使用“观察者”方法,我们有可能更新用户界面太多次

    这两个缺点都可以通过在附加逻辑中嵌入每个应用程序操作来解决(对于观察者:发送开始-结束通知,对于标记脏:发送更新自己通知)。

    请注意,在非窗口应用程序中,这可能不是问题。例如,您可以使用mark dirty方法,仅当某些计算需要数据时,它可能需要进行一些额外的处理,以防数据变脏(这是一种缓存方法)。

    但是,对于窗口应用程序,没有信号表明用户正在“查看您的屏幕”,并且窗口应该更新。因此,没有一个真正的好时机可以让您查看脏数据(尽管您可以对焦点事件做一些技巧)。

    解决这个问题的好办法是什么?在你的申请中你是如何解决这些问题的?

    注意,我不想在应用程序的计算/数据模型部分引入窗口技术。如果需要使用窗口技术来解决这个问题,那么只能在应用程序的用户界面部分使用。

    你知道吗?

    3 回复  |  直到 9 年前
        1
  •  2
  •   graham.reeds    15 年前

    几年前我在一个大型windows应用程序中使用的一种方法是 WM_KICKIDLE . 所有可更新的东西都使用一个称为 IdleTarget IdleTargetManager KICKIDLE 消息和调用已注册客户端列表上的更新。在您的实例中,您可以创建一个要更新的特定目标的列表,但是我发现注册客户机的列表已经足够了。

    我只找到了一张实时图表。仅使用kick idle消息,由于图形的不断更新,它将使CPU达到100%。使用计时器睡眠,直到下一次刷新解决了这个问题。

    如果您需要更多帮助-我可以以合理的价格提供…:-)

        2
  •  0
  •   Matthieu M.    15 年前

    其中仅在提交时发送通知。

    它的缺点是必须重写一些代码。。。

        3
  •  0
  •   Tom Dalling    15 年前

    您可以将观察者模式与合并一起使用。不过,在C++中实现它可能有点丑。它看起来像这样:

    m_observerList.beginCoalescing();
    m_observerList.notify();
    m_observerList.notify();
    m_observerList.notify();
    m_observerList.endCoalescing(); //observers are notified here, only once
    

    所以即使你打电话 notify 三次,观察者直到 endCoalescing 当观察员只收到一次通知时。

    推荐文章