是否有一些用于模拟Glib::D ispatcher的Boost功能

Is there some Boost functionality for simulating a Glib::Dispatcher?

本文关键字:ispatcher Boost 功能 Glib 用于 模拟 是否      更新时间:2023-10-16

我目前正在重构一个中型软件项目。它包含一个由多个线程使用的类似内核的中央类。目前,此类使用 Glib::Dispatcher 来处理由多个线程发出的信号。由于重构过程的一个目标是完全摆脱glibmm(因为Qt将用作新框架),我正在尝试找出一种如何使用Boost"模拟"调度程序功能的方法。我已经研究了Boost.SignalsBoost.Signals2,但这些库似乎都没有提供调度程序的替代方案。

为了澄清调度员应该做什么,以下是官方文档中的简短描述:

Glib::D ispatcher的工作方式类似于sigc::signal。但不像 正常信号,通知通过 管。这是一种简单有效的通信方式 线程,在具有单个 GUI 的线程模型中特别有用 线。

不涉及互斥锁,除了操作系统的 内部 I/O 锁定。这意味着一些使用规则:

  • 只有一个线程可以连接到信号并接收通知,但多个线程 即使没有锁定,也允许发件人。
  • GLib 主循环必须在接收线程中运行(这通常是 GUI 线程)。
  • 调度程序对象必须由接收方线程实例化。
  • 调度程序对象应在创建任何 发送方线程,如果要避免额外的锁定。
  • 接收方线程必须删除调度程序对象。
  • 由同一接收方线程实例化的所有调度程序对象必须使用相同的主 上下文。

你能给我一些正确方向的指示吗?这是我可以使用Boost.SignalsBoost.Signals2实现的功能吗?

编辑:正如评论者正确指出的那样,使用Qt可能是一种选择。但是,我正在重构的类是非常低级的,我不想添加这个额外的依赖项。

我认为没有简单的方法可以做到这一点,删除 Glib 的提升味道并不能解决问题,这比其他任何事情都更像是一个建筑问题。替换为 Boost 不会解决设计问题。您应该对自己的信号接口进行建模,并尝试适应每个库,首先包括 Glib,因为它已经在工作,为您的问题添加另一个间接级别将使您能够解决这个问题。

如果你看看boost::function,Boost可以帮助你。我不认为用 boost 替换 glib 是真正的进步,boost 不是一个图形库,在某些时候需要向图形引擎添加一个带有实现层的接口。

我现在选择了对有问题的类进行完全重写。事实证明,我不需要Glib提供的方式提供调度程序功能。相反,使用正常的boost::signals2信号,再加上一些来自Qt的信号,进行实际的图形交互就足够了。