是否有一些用于模拟Glib::D ispatcher的Boost功能
Is there some Boost functionality for simulating a Glib::Dispatcher?
我目前正在重构一个中型软件项目。它包含一个由多个线程使用的类似内核的中央类。目前,此类使用 Glib::Dispatcher
来处理由多个线程发出的信号。由于重构过程的一个目标是完全摆脱glibmm
(因为Qt
将用作新框架),我正在尝试找出一种如何使用Boost
"模拟"调度程序功能的方法。我已经研究了Boost.Signals
和Boost.Signals2
,但这些库似乎都没有提供调度程序的替代方案。
为了澄清调度员应该做什么,以下是官方文档中的简短描述:
Glib::D ispatcher的工作方式类似于sigc::signal。但不像 正常信号,通知通过 管。这是一种简单有效的通信方式 线程,在具有单个 GUI 的线程模型中特别有用 线。
不涉及互斥锁,除了操作系统的 内部 I/O 锁定。这意味着一些使用规则:
- 只有一个线程可以连接到信号并接收通知,但多个线程 即使没有锁定,也允许发件人。
- GLib 主循环必须在接收线程中运行(这通常是 GUI 线程)。
- 调度程序对象必须由接收方线程实例化。
- 调度程序对象应在创建任何 发送方线程,如果要避免额外的锁定。
- 接收方线程必须删除调度程序对象。
- 由同一接收方线程实例化的所有调度程序对象必须使用相同的主 上下文。
你能给我一些正确方向的指示吗?这是我可以使用Boost.Signals
或Boost.Signals2
实现的功能吗?
编辑:正如评论者正确指出的那样,使用Qt
可能是一种选择。但是,我正在重构的类是非常低级的,我不想添加这个额外的依赖项。
我认为没有简单的方法可以做到这一点,删除 Glib 的提升味道并不能解决问题,这比其他任何事情都更像是一个建筑问题。替换为 Boost 不会解决设计问题。您应该对自己的信号接口进行建模,并尝试适应每个库,首先包括 Glib,因为它已经在工作,为您的问题添加另一个间接级别将使您能够解决这个问题。
如果你看看boost::function,Boost可以帮助你。我不认为用 boost 替换 glib 是真正的进步,boost 不是一个图形库,在某些时候需要向图形引擎添加一个带有实现层的接口。
我现在选择了对有问题的类进行完全重写。事实证明,我不需要Glib
提供的方式提供调度程序功能。相反,使用正常的boost::signals2
信号,再加上一些来自Qt
的信号,进行实际的图形交互就足够了。
- 理解boost::asio-async_read在无需读取内容时的行为
- boost::进程间消息队列引发错误
- 如何运行位于boost/libs/python/example/tutorial目录中的hello.cpp和Jamfil
- cmake如何在fedora工作站中找到boost静态库包
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- Boost Graph Library,修复节点大小
- 什么是"#include <boost/functional/hash.hpp> "?
- 基于boost的程序的静态链接——zlib问题
- C++:如何在CLion IDE中安装Boost
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 如何在boost beast http请求中设置http头
- Boost Spirit,获取迭代器内部语义动作
- boost::asio::steady_timer()与sleep()我应该使用哪一个
- boost::asio如何生成多个协同程序,然后加入它们
- 当我尝试使用 sstream 和分面将 Boost Time_duration转换为字符串时,我没有得到所需的格式
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- 如何使用boost::具有嵌套结构和最小代码更改的序列化
- 使用Boost Interprocess创建托管共享内存需要很长时间
- Boost::posix_time::ptime舍入到给定的分钟数
- 是否有一些用于模拟Glib::D ispatcher的Boost功能