3

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

为了阐明调度员应该做什么,这里有一个来自官方文档的简短描述:

Glib::Dispatcher 的工作方式类似于 sigc::signal。但与普通信号不同的是,通知是通过管道异步发生的。这是在线程之间进行通信的一种简单而有效的方式,在具有单个 GUI 线程的线程模型中特别有用。

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

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

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

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

4

2 回答 2

0

我现在选择了完全重写所讨论的课程。事实证明,我不需要Glib. boost::signals2相反,使用正常信号以及来自实际图形交互Qt的一些信号就足够了。

于 2012-06-05T13:31:21.380 回答
0

我认为没有简单的方法可以做到这一点,以 boost 的形式删除 Glib 并不能解决问题,这更像是一个架构问题。用 Boost 替换不会解决设计问题。您应该为自己的信号接口建模,并尝试适应每个库,首先包括 Glib,因为它已经在工作,为您的问题添加另一个间接级别将让您解决该问题。

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

于 2012-05-29T06:42:07.190 回答