在Qt中,用一个信号将数据传递到多个插槽是否安全?

在Qt中,用一个信号将数据传递到多个插槽是否安全?,qt,Qt,我的Qt应用程序不断地从服务器端接收数据包,并在数据的基础上构造对象。 我必须将这些对象(一次一个)传递给三个不同的小部件。所以,我已经将一个信号连接到所有三个小部件的插槽,但我怀疑这样传递对象是否安全?假设数据包以较快的速度到达,这些数据包会被新的数据包覆盖吗?对象是否会因此而损坏,或者在处理旧数据包时是否会丢失一些数据包或数据 是否有机制确保不会发生超支。此外,如果数据包以非常快的速率传输,会有一些限制。我不确定这部分的网络编程部分,但就信号和插槽而言,您应该能够将一个信号连接到所需的任意多

我的Qt应用程序不断地从服务器端接收数据包,并在数据的基础上构造对象。 我必须将这些对象(一次一个)传递给三个不同的小部件。所以,我已经将一个信号连接到所有三个小部件的插槽,但我怀疑这样传递对象是否安全?假设数据包以较快的速度到达,这些数据包会被新的数据包覆盖吗?对象是否会因此而损坏,或者在处理旧数据包时是否会丢失一些数据包或数据


是否有机制确保不会发生超支。此外,如果数据包以非常快的速率传输,会有一些限制。

我不确定这部分的网络编程部分,但就信号和插槽而言,您应该能够将一个信号连接到所需的任意多个插槽。

将单个信号连接到多个插槽是Qt的设计特点

所有(几乎?)Qt,所以您可以随意传递它们。它们大多也是“书面复制”,所以你可以在任何你想复制的地方自由复制它们,而不会造成真正的性能损失


与任何其他多线程代码一样,如果多个线程同时写入同一对象,则需要小心。

Qt的信号和插槽在程序的事件循环中处理。当发出信号时,对任何已连接插槽的调用都将排队,并将在事件循环的滴答声中处理。发射信号的开销非常低;根据Qt的文档,当连接到一个插槽时,每秒可以发出大约2000000个信号,当连接到i586-500上的两个插槽时,每秒可以发出1200000个信号。与发送信号所花费的时间相比,处理传入数据可能是程序响应时间中更大的一部分。只要您的数据对象构造能够跟上来自网络的信息的速率,您就能够毫无问题地发出信号。信号将被添加到接收对象的队列中,以便在事件循环的下一个过程中进行处理,因此不会丢失或覆盖任何信号

如果您担心多个接收器修改数据包数据,只要您通过将数据对象按值传递给信号而不是引用或指针来发送传入网络数据的唯一副本,就可以连接到多个插槽,而不用担心插槽修改数据


我使用信号和插槽机制来处理传入的网络数据,这对一个小组学校项目非常有效。它使用UDP协议与客户端通信,以实现类似小行星的多人射击游戏。我在使用信号和插槽在服务器的各个类中传递数据包时没有遇到任何问题。我遇到的大多数问题都是由于游戏网络代码的算法简单。(每个数据包都会更新所有内容,没有客户端延迟补偿,等等)如果您感兴趣,可以在此处查看代码:感兴趣的是“netlib”“server”和“client”目录。

附带说明,不必从事件循环调用插槽。当信号从与接收对象相同的线程发出,并且您使用默认参数进行连接时,您会得到一个直接连接,这意味着信号插槽调用只不过是一个简单的直接函数调用。“所有(几乎?)Qt对象一个引用计数”--更正:所有Qt值类都是引用计数的(像
QString
QImage
QHash
等等),而
QObject
实例通常通过指针传递,因为它们不可复制。