什么是信号槽?深入理解信号槽
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么是信号槽?深入理解信号槽相关的知识,希望对你有一定的参考价值。
第3页 两个不同的术语以及各自的动作:信号和槽两个不同的术语以及各自的动作:信号和槽;在一个地方(信号)可以连接零个或者多个回调函数(槽),同时也是多对多的;
焦点在于连接本身,而不是提供者或者消费者;
不需要手工为了一个连接创建新的类;
连接仍旧是类型安全的。
这五点是信号槽系统的核心,Qt 和 boost 都拥有这些特性。下面则是二者的不同之处:
Boost.Signals
Qt Signals 和 Slots
一个信号就是一个对象 信号是具有名字的成员函数的签名
发出信号类似于函数调用 发出信号类似于函数调用,Qt 提供了一个 emit 关键字来完成这个操作
信号可以是全局的、局部的或者是成员对象 信号只能是成员函数
任何能够访问到信号对象的代码都可以发出信号 只有信号的拥有者才能发出信号
槽是任何可被调用的函数或者函数对象 槽是经过特别设计的成员函数
可以有返回值,返回值可以在多个槽中使用 没有返回值
同步的 同步的或者队列的
非线程安全 线程安全,可以跨线程使用
当且仅当槽是可追踪的时候,槽被销毁时,连接自动断开 槽被销毁时,连接都会自动断开(因为所有槽都是可追踪的)
类型安全(编译器检查) 类型安全(运行期检查)
参数列表必须完全一致 槽可以忽略信号中多余的参数
信号、槽可以是模板 信号、槽不能是模板
C++ 直接实现 通过由 moc 生成的元对象实现(moc 以及元对象系统都是 C++ 直接实现的)
没有内省机制 可以通过内省发现
可以通过元对象调用
连接可以从资源文件中自动推断出
最重要的是,Qt 的信号槽机制已经深深地植入到框架之中,成为不可分割的一部分。它们可以使用 Qt 专门的开发工具,例如 QtCreator,通过拖拽的方式很轻松的创建、删除、修改。它们甚至可以通过动态加载资源文件,由特定命名的对象自动动态生成。这些都是 boost 作为一个通用库所不可能提供的。 参考技术A 信号是表示消息的物理量,如电信号可以通过幅度、频率、相位的变化来表示不同的消息。这种电信号有模拟信号和数字信号两类。信号是运载消息的工具,是消息的载体。从广义上讲,它包含光信号、声信号和电信号等。按照实际用途区分,信号包括电视信号、广播信号、雷达信号,通信信号等;按照所具有的时间特性区分,则有确定性信号和随机性信号等。
信号是运载消息的工具,是消息的载体。从广义上讲,它包含光信号、声信号和电信号等。例如,古代人利用点燃烽火台而产生的滚滚狼烟,向远方军队传递敌人入侵的消息,这属于光信号;当我们说话时,声波传递到他人的耳朵,使他人了解我们的意图,这属于声信号;
遨游太空的各种无线电波、四通八达的电话网中的电流等,都可以用来向远方表达各种消息,这属电信号。人们通过对光、声、电信号进行接收,才知道对方要表达的消息。
Qt信号与槽函数问题
参考技术A 进程肯定不会产生了。Qt的信号槽是个很复杂的机制,哥大致给你介绍一下Qt的信号槽既可以同步触发,也可以异步触发。当你进行connect的时候,实际上还有第五个参数(可以自己看SDK的介绍)。如果说是默认的,那么要看信号和槽是否属于同一个线程(这里,你可以简单理解为是否是同一个类),然后根据connect的第五个属性来判断是否是同步还是异步。比如BlockingQueuedConnection模式,就会出现你说的多次触发信号阻塞问题,他只有等到上一个触发完成才能继续。槽函数不会产生新线程,他是决定了槽函数声明在哪个线程中,如果默认情况下,在同一个线程里面是同步的,你此时可以理解为普通调用,如果在不同线程里面,槽函数运行的线程通常是异步调用,但是还有一个所谓的事件中心一直run着在处理,就是一个信号队列,没触发一个信号就入队列,先进先出。本回答被提问者采纳以上是关于什么是信号槽?深入理解信号槽的主要内容,如果未能解决你的问题,请参考以下文章