信号和插槽的效用是什么
what's the utility of signals and slots
实际上,我在Qt中编程时一直在使用信号和插槽。信号和槽的主要用途是在UI交互中,例如,单击按钮会发送一个信号,调用槽来执行操作。我知道可以将信号和插槽用于非gui应用程序,例如服务器端应用程序。我寻找了其他提供信号和插槽的库,发现了boost库。这与我从Qt中学到的有些不同。然后我想知道信号和插槽的真正效用是什么,因为我可以手动调用一个函数来在给定的时间执行一个操作。
例如在boost中,这里有一个信号/时隙的例子:
#include <boost/signals2.hpp>
#include <iostream>
void mySlot(){
std::cout << "I'm a slot" << std::endl;
}
void main(){
boost::signals2::signal<void ()> sig;
// Connecting the slot to the signal.
sig.connect(mySlot);
// Emitting a signal that will call mySlot
sig();
return 0;
}
我可以简单地用mySlot()
的简单调用来做同样的事情,不是吗?
这并不是说让我想到的是,当我们试图连接两个不同的插槽时,它们的调用顺序与连接顺序相同。如果第一个槽被阻塞(尝试添加一个无限循环),第二个槽将永远不会被调用!我猜这是一种向量,它存储函数的地址,然后迭代循环并逐个调用!
信号和插槽背后有什么魔力?或者它只是开发人员的一种抽象?
提前谢谢。
简而言之:在我看来,主要思想是解耦。
在更长的中:例如,使用直接函数调用,您不可能在公共功能和客户端之间建立一个很好的独立机构。与信号和插槽不同,这将是一种紧密耦合,因为您需要在某个条件满足您的标准时知道要调用哪些方法。
如果你想获得更多的自由,就像许多其他OOP设计模式一样,你需要一些信号和插槽之类的东西。当一个公共组件(我们称之为库)发出信号时,它不必知道(可能还不存在)客户端接口。这使得通用组件足够灵活。
它还将更好地保持应用程序的响应性,因为它不是直接调用,而是由Qt事件循环处理的。可以说,您可以通过自定义线程机制来规避这一点,但要使其足够安全,还需要做更多的工作,而且您最终会做一些事情来解决这一问题。
信号和槽只是一种通信机制,可以在不同的执行线程之间使用。这是主要值(尤其是在以GUI为中心的库(如QT)中)。通常有1个线程负责绘制和管理应用程序的图形侧,以及1个或多个工作线程。使用信号和槽可以从中抽象出来。如果你想使用直接函数调用,你需要同步线程,这会降低GUI端的性能和响应能力。
事实上,在一个执行线程中,使用信号和槽并没有多大意义。当您想要在进程之间(在同一台机器上或在不同的机器之间)进行通信时,该值就会出现。
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- C++避免重复声明的语法是什么
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- C++从另一个类访问公共静态向量的正确方法是什么
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- C++中名称篡改的目的是什么
- 当再次触发信号时,从Qt插槽执行的功能被第二次调用时会发生什么?
- 文档在哪里说明如果参数不是从末端删除参数,则无法从QT信号插槽连接中删除参数?
- 这是在Qt信号和插槽中使用参数调用函数的好方法吗?
- Qt信号和插槽:是复制的参考参数
- 信号和插槽的效用是什么
- Qt UI 插槽不是由从基类继承的信号调用的
- pyQT 插槽装饰器什么是C++等价物
- 创建 2D 数组并在每个数据槽中填充不同字符的最简单方法是什么?
- QTimer::singleShot() 在给定对象的父类中查找指定的插槽,而不是对象本身
- Qt按钮是呼叫2插槽,我只需要一个
- 当预处理器看到插槽 (a) "1" #a时会发生什么情况
- QT 5.6.1应用程序仅在x86 arch上退出插槽后崩溃,而不是x64
- 多处理器环境中主机和插槽的区别是什么?