我目前正在重构一个中型软件项目。它包含一个由多个线程使用的类似中央内核的类。目前,该类使用Glib::Dispatcher
来处理由多个线程发出的信号。由于重构过程的一个目标是完全摆脱glibmm
(因为Qt
将被用作新框架),我试图找出一种如何“模拟”调度程序的方法使用Boost
的功能。我已经查看了Boost.Signals
和Boost.Signals2
,但这些库中没有一个似乎提供了调度程序的替代方案。
为了澄清调度员应该做什么,这里是the official documentation的简短描述:
Glib :: Dispatcher的工作方式类似于sigc :: signal。但不像 正常信号,通知通过a异步发生 管。这是一种简单有效的通信方式 线程,尤其适用于具有单个GUI的线程模型 线程。
除操作系统外,不涉及互斥锁定 内部I / O锁定。这意味着一些使用规则:
- 只有一个线程可以连接到信号并接收通知,但是多个 即使没有锁定也允许发件人。
- GLib主循环必须在接收线程中运行(通常是GUI线程)。
- Dispatcher对象必须由接收者线程实例化。
- 应该在创建任何一个之前实例化Dispatcher对象 发送方线程,如果你想避免额外的锁定。
- 接收方线程必须删除Dispatcher对象。
- 由同一接收方线程实例化的所有Dispatcher对象必须使用相同的main 上下文。
你能指点一下正确的方向吗?这是我使用Boost.Signals
或Boost.Signals2
?
编辑:正如一位评论者正确指出的那样,使用Qt
也许是一种选择。但是,我重构的类是非常低级的,我不想添加这个额外的依赖。
答案 0 :(得分:0)
我认为没有简单的方法可以做到这一点,在提升风格中删除Glib并不能解决这个问题,而这个问题更像是一个架构问题而不是其他问题。用Boost取代不会解决设计问题。 您应该建模自己的信号接口,并尝试适应每个库,包括Glib,因为它已经在工作,因此为您的问题添加另一个间接级别将让您解决该问题。
如果你看boost::function,Boost可以帮助你。我不考虑用boost替换glib是一个真正的进步,boost不是图形库,并且在某些时候需要向图形引擎添加带有实现层的接口。
答案 1 :(得分:0)
我现在已选择完全重写该课程。事实证明,我不要求调度员功能与Glib
提供的方式相同。相反,它足以使用正常的boost::signals2
信号,再加上来自Qt
的一些信号,用于实际的图形交互。