什么是信号和插槽的效用

时间:2013-12-29 20:58:08

标签: c++ qt boost qtcore qt-signals

实际上我在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()来做同样的事情,不是吗?

并不是说让我想到的是当我们尝试连接两个不同的插槽时,它们的调用顺序与连接相同。如果第一个插槽阻塞(尝试添加无限循环),则永远不会调用第二个插槽!我猜这是一种存储函数地址的向量,然后迭代循环并逐个调用!

信号和插槽背后的魔力是什么?或者它只是开发人员的一种抽象?

提前谢谢。

2 个答案:

答案 0 :(得分:3)

简而言之:在我看来,主要的想法是脱钩

更长的:对于直接函数调用,例如,在公共功能和客户端之间没有完全独立的建立。与信号和插槽不同,会有一个紧耦合,因为你需要知道某些条件满足你的标准,哪种方法可以正确调用。

如果您希望获得更多自由,就像许多其他OOP设计模式一样,您需要信号和插槽之类的东西。当一个公共组件,我们称之为库,发出一个信号,它不必知道(可能尚未存在的)客户端接口。这使得通用组件足够灵活。

它还可以更好地保持应用程序的响应性,因为它不是直接调用,而是由Qt事件循环处理。可以说,你可以通过自定义线程机制来规避这个问题,但是要使它足够安全还需要做更多工作,最终你会在一天结束时做一些事情。

答案 1 :(得分:0)

Rednaks,

信号和插槽只是一种可以跨不同执行线程使用的通信机制。这是主要价值(特别是在像QT这样的GUI焦点库中)。通常有1个线程负责绘制和管理应用程序的图形端以及1个或多个工作线程。使用信号和插槽可以从中抽象出来。如果你想使用直接函数调用,你需要同步线程,这会导致GUI端的性能和响应性降低。

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