问:如果你发送信号太快会发生什么

Qt: what happens if you send out signals too quickly?

本文关键字:什么 如果 信号      更新时间:2023-10-16

情况如下:

  • 您有一个在后台线程中运行的长时间运行的计算
  • 该计算是每隔100毫秒发送一个信号,例如刷新GUI元素
  • 假设它发出100个这样的信号
  • 正在重新绘制的小部件需要超过100毫秒才能重新绘制;比方说1秒

事件循环中发生了什么?信号是否调用"堆积",直到它们全部执行(即100秒)?是否有"丢弃"事件的机制?

用户事件永远不会被丢弃。如果对发出的信号事件进行排队的速度快于处理它们的速度,则事件队列将增长,直到内存耗尽,程序将崩溃。不过,值得注意的是,如果系统负载过重,QTimer将跳过超时事件。在某种程度上,这可能有助于调节您的吞吐量。

你也可以考虑从一个线程向另一个线程发送反馈(也许是确认),并根据消费者线程的落后程度手动调整生产者线程中的时间。或者,你可以使用隐喻性的大锤,切换到阻塞排队连接。

在您的示例中,您可以在小部件中测量绘图时间。例如,如果绘图耗时240毫秒,则可以快速处理接下来的2个信号,而不需要绘制任何内容。这样信号就不会堆积起来。

编辑:

事实上,我的解决方案有一个小问题。最后一个信号应该总是导致重新绘制,否则在计算完成时小部件会显示错误的数据。

当跳过一个信号时,可以例如以150毫秒的间隔启动单次计时器。当由于信号而重新绘制时,此计时器将停止。因此,在最后一次重绘信号之后,这个单次计时器将导致绘制最终状态。我想这是可行的,但会很复杂。

当计算开始时,启动一个简单的计时器来重新绘制可能是一种更好的方法。如果绘制小部件需要花费大量时间,则可以根据绘制时间动态调整计时器间隔。

相关文章: