3

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

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

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

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

4

2 回答 2

1

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

我会做什么:

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

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

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

于 2009-01-02T15:20:20.320 回答
0

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

于 2009-04-16T23:18:40.653 回答