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

时间:2012-07-24 13:41:05

标签: qt

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

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

3 个答案:

答案 0 :(得分:6)

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

所有(差不多?)Qt value classes are reference counted,所以你可以随心所欲地传递它们。它们大多也是“写入时复制”,因此您可以随意复制它们,而不会产生任何实际的性能损失。

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

答案 1 :(得分:2)

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

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

我已经使用信号和插槽机制来处理传入的网络数据,从而对小组学校项目产生很大影响。它使用UDP协议与客户进行通信,以实现让人想起小行星的多人射击游戏。我没有遇到使用信号和插槽在服务器的各个类周围传递数据包数据的问题。我遇到的大多数问题都归因于游戏网络代码的算法简单性。 (每个数据包都会更新,没有客户端延迟补偿等)如果您感兴趣,请在此处查看代码的公开:http://foxx.arksaw.com/svn/tis/感兴趣的是“netlib”“服务器”和“客户端”目录。

答案 2 :(得分:1)

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