Qt 和 Boost关于信号和槽的对比说明


对比 安全

不管是 Qt 的实现方式仍是 Boost 的实现方式,除了必须的定义信号和槽的类以外,都不须要额外的类。 框架

两种实现都解决了类爆炸的问题。下面让咱们对照着来看一下咱们前面的分析。 异步

  • 两个不一样的术语以及各自的动做:信号和槽函数

  • 在一个地方(信号)能够链接零个或者多个回调函数(槽)同时也是多对多的,一对多,多对多工具

  • 焦点在于链接自己,而不是提供者或者消费者;开发工具

  • 不须要手工为了一个链接建立新的类spa

  • 链接仍旧是类型安全的线程

这五点是信号槽系统的核心,Qt 和 boost 都拥有这些特性。 设计

 

下面则是两者的不一样之处:code

Boost.Signals Qt Signals 和 Slots
信号 一个信号就是一个对象
全局的、局部的或者是成员对象
信号只能是成员函数
调用 发出信号相似于函数调用
任何可以访问到信号对象的代码均可以发出信号
发出信号相似于函数调用
Qt 提供了一个 emit 关键字来完成这个操做
只有信号的拥有者才能发出信号
槽是任何可被调用的函数或者函数对象 槽是通过特别设计的成员函数
返回值 能够有返回值?,返回值能够在多个槽中使用 没有返回值
同步异步 同步 同步或(直连)者异步(队列)
线程安全 非线程安全? 线程安全,能够跨线程使用
信号断开 当且仅当槽是可追踪的时候?,槽被销毁时,链接自动断开 槽被销毁时,链接都会自动断开(由于全部槽都是可追踪的)
类型安全 类型安全(编译器检查) 类型安全(运行期检查)
参数列表 参数列表必须彻底一致 槽能够忽略信号中多余的参数(信号的参数能够比槽多)
信号、槽能够是模板 信号、槽不能是模板
底层实现 C++ 直接实现 经过由 moc 生成的元对象实现(moc 以及元对象系统都是 C++ 直接实现的)
内省 没有内省机制 能够经过内省发现

能够经过元对象调用

链接能够从资源文件中自动推断出

?都是有疑问的地方。目前还未理解

最重要的是,Qt 的信号槽机制已经深深地植入到框架之中,成为不可分割的一部分。它们可使用 Qt 专门的开发工具,例如 QtCreator,经过拖拽的方式很轻松的建立、删除、修改。它们甚至能够经过动态加载资源文件,由特定命名的对象自动动态生成。这些都是 boost 做为一个通用库所不可能提供的。

 

-----------------------------------------------------------------------------------------------------------------------------------

 

转帖地址:http://no001.blog.51cto.com/1142339/1335733/

相关文章
相关标签/搜索