背景
- 有一个长耗时的后台计算线程
- 计算过程中每隔100ms会发出刷新GUI元素的信号
- 假设发送100次这个信号
- 窗口重绘需要花费超过100ms的时间,假设是1s
问题
在事件循环中会发生什么?信号是否会堆积直到它们都执行完(100s)?是否有丢弃事件的机制?
回答一:
用户事件永远不会丢弃。如果发送信号过快超过处理时间,时间会排队指导耗尽内存而程序崩溃。然而,QTimer在负载过重时会跳过超时事件。这在某种程度上调节了负载。
你可以从一个消费者线程中发送反馈(比如通知)给生产者线程,根据消费者落后多久来手动调整生产者线程的发送时间。或者将信号槽换成阻塞连接的方式。
回答二:
在这个例子中可以计算绘制时间,比如绘制花费240ms,那么你在后面两次收到信号时不再绘制,也就是忽略信号,这样信号就不会堆积了。