信号和插槽的效用是什么

what's the utility of signals and slots

本文关键字:是什么 插槽 信号      更新时间:2023-10-16

实际上,我在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端的性能和响应能力。

事实上,在一个执行线程中,使用信号和槽并没有多大意义。当您想要在进程之间(在同一台机器上或在不同的机器之间)进行通信时,该值就会出现。