【问题标题】:Notifications in wxWidgets?wxWidgets 中的通知?
【发布时间】:2009-01-02 15:03:41
【问题描述】:

我正在使用 C++/wxWidgets 开发一个小型应用程序,其中 GUI 的几个部分需要根据例如更新收到 UDP 数据报。更具体地说,辅助线程尝试在网络中保留可用“客户端”的列表(可能会出现和消失),例如需要更新 UI 中的相应组合框以反映更改。

文档提到,对于这种事情,EVT_UPDATE_UI 将是一个不错的选择。据我从稀疏文档中了解到,这个事件是由系统自动发送的,并为辅助 UI 更改提供了一些支持。

但是,我会觉得使用更直接的方法会更舒服,例如窗口对象可以注册/订阅以接收特定事件的通知(事件或回调),并且代码的另一部分在需要时发送这些通知。我可以使用我自己的代码在 C++ 中做到这一点,但是我想如果 wxWidgets 已经支持类似的东西,我应该使用它。但是我在这方面没有发现任何东西。

所以,问题是:wxWidgets 是否支持这种通知系统(或类似的替代方案),还是我最好自己编写代码?

【问题讨论】:

    标签: wxwidgets


    【解决方案1】:

    AFAIK 在 wxWidgets 中没有任何东西可以直接使用,但是你自己做这件事似乎很容易。

    我会做什么:

    • 创建一个 wxEvtHandler-descendent 类来保存网络中可用“客户端”的列表。让这个类有一个 wxCriticalSection,并在所有添加或删除“客户端”的方法中使用 wxCriticalSectionLocker。

    • 通过继承 wxThread 创建一个工作线程类来处理您的 UDP 数据报,使用阻塞调用。每当必须添加或删除客户端时,线程应直接调用客户端列表对象的方法。在这些方法中更新客户端列表,并 ::wxPostEvent() 向自身发送一个事件(这将在主 GUI 线程中执行整个通知调用)。

    • 在客户端列表类中处理事件,并通知所有监听器客户端列表已更改。在我看来,观察者模式很合适。您可以直接调用所有已注册侦听器的方法,也可以向它们发送 wxCommandEvent。

    【讨论】:

      【解决方案2】:

      您是否尝试过在发生变化的小部件上调用 Update()?更新组合框的内容后,调用 Update(),内容应该会更新。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-08-19
        • 1970-01-01
        • 1970-01-01
        • 2019-08-27
        • 1970-01-01
        • 2014-07-15
        • 2013-07-13
        相关资源
        最近更新 更多