5

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

是否有机制确保不会发生溢出。另外,如果数据包的速度非常快,会不会有一些节流。

4

3 回答 3

6

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

所有(几乎?)Qt值类都是引用计数的,因此可以安全地随意传递它们。它们大多也是“写时复制”,因此您可以在任何您想要的地方自由地复制它们,而不会造成真正的性能损失。

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

于 2012-07-24T14:34:20.290 回答
2

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

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

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

于 2012-07-24T14:55:53.963 回答
1

我不确定其中的网络编程部分,但就信号和插槽而言,您应该能够根据需要将一个信号连接到尽可能多的插槽。

于 2012-07-24T14:18:49.473 回答