是否有一些Boost功能用于模拟Glib :: Dispatcher?

时间:2012-05-24 19:35:56

标签: c++ multithreading glib boost-signals boost-signals2

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

为了澄清调度员应该做什么,这里是the official documentation的简短描述:

  

Glib :: Dispatcher的工作方式类似于sigc :: signal。但不像   正常信号,通知通过a异步发生   管。这是一种简单有效的通信方式   线程,尤其适用于具有单个GUI的线程模型   线程。

     

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

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

你能指点一下正确的方向吗?这是我使用Boost.SignalsBoost.Signals2

可以实现的功能

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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

我现在已选择完全重写该课程。事实证明,我要求调度员功能与Glib提供的方式相同。相反,它足以使用正常的boost::signals2信号,再加上来自Qt的一些信号,用于实际的图形交互。