Qt如果发送信号过快会如何?


背景

  • 有一个长耗时的后台计算线程
  • 计算过程中每隔100ms会发出刷新GUI元素的信号
  • 假设发送100次这个信号
  • 窗口重绘需要花费超过100ms的时间,假设是1s

问题

在事件循环中会发生什么?信号是否会堆积直到它们都执行完(100s)?是否有丢弃事件的机制?

回答一:

用户事件永远不会丢弃。如果发送信号过快超过处理时间,时间会排队指导耗尽内存而程序崩溃。然而,QTimer在负载过重时会跳过超时事件。这在某种程度上调节了负载。
你可以从一个消费者线程中发送反馈(比如通知)给生产者线程,根据消费者落后多久来手动调整生产者线程的发送时间。或者将信号槽换成阻塞连接的方式。

回答二:

在这个例子中可以计算绘制时间,比如绘制花费240ms,那么你在后面两次收到信号时不再绘制,也就是忽略信号,这样信号就不会堆积了。