问:如果你发送信号太快会发生什么
Qt: what happens if you send out signals too quickly?
情况如下:
- 您有一个在后台线程中运行的长时间运行的计算
- 该计算是每隔100毫秒发送一个信号,例如刷新GUI元素
- 假设它发出100个这样的信号
- 正在重新绘制的小部件需要超过100毫秒才能重新绘制;比方说1秒
事件循环中发生了什么?信号是否调用"堆积",直到它们全部执行(即100秒)?是否有"丢弃"事件的机制?
用户事件永远不会被丢弃。如果对发出的信号事件进行排队的速度快于处理它们的速度,则事件队列将增长,直到内存耗尽,程序将崩溃。不过,值得注意的是,如果系统负载过重,QTimer将跳过超时事件。在某种程度上,这可能有助于调节您的吞吐量。
你也可以考虑从一个线程向另一个线程发送反馈(也许是确认),并根据消费者线程的落后程度手动调整生产者线程中的时间。或者,你可以使用隐喻性的大锤,切换到阻塞排队连接。
在您的示例中,您可以在小部件中测量绘图时间。例如,如果绘图耗时240毫秒,则可以快速处理接下来的2个信号,而不需要绘制任何内容。这样信号就不会堆积起来。
编辑:
事实上,我的解决方案有一个小问题。最后一个信号应该总是导致重新绘制,否则在计算完成时小部件会显示错误的数据。
当跳过一个信号时,可以例如以150毫秒的间隔启动单次计时器。当由于信号而重新绘制时,此计时器将停止。因此,在最后一次重绘信号之后,这个单次计时器将导致绘制最终状态。我想这是可行的,但会很复杂。
当计算开始时,启动一个简单的计时器来重新绘制可能是一种更好的方法。如果绘制小部件需要花费大量时间,则可以根据绘制时间动态调整计时器间隔。
相关文章:
- 线程,如果else语句,都是错误的上下文切换后,会发生什么
- int数据类型的指针指向的是什么,如果是一个类的私有数据成员,我们创建了该类的两个对象?
- C++如果必须在编译时确定大小,std::array 有什么意义?
- 如果 KEY 是 std::list 或 std::vector 而不是值,那么 std::map 的默认行为是什么?
- 如果我真的真的想从 STL 容器继承,并且我继承构造函数并删除新运算符,会发生什么?
- 如果我在 const 函数上使用指针,我可以返回什么?
- 基本的 c++ 问题:如果我在函数中创建某些内容并返回它会发生什么?
- 如果我在字符数组上使用 close() 会发生什么?
- 如果在双引号末尾传递逗号(,),"cout"的行为是什么?
- 如果结构中的字符串比使用的 p/调用签名长或短,会发生什么情况?
- 如果我向一个12字节的缓冲区写入的字节数少于12,会发生什么情况
- 如果与memory_order_acquire一起存储会发生什么
- 如果我们不从 std::qsort 返回 0 会发生什么?
- 如果我在 c++ 中以 new 的放置形式使用没有足够的内存,会发生什么情况?
- 如果在 C++ 构造函数中以错误的顺序初始化对象数据,会发生什么类型的错误
- 如果我使用同一个密钥推送用户数据两次,会发生什么
- 这个问题叫什么?如果通过基类型传递结构,则后代类型中的字段在方法中不可用
- {1, 2} 是值吗?如果是,它的类型是什么?如果不是,为什么可以将其分配给初始值设定项列表
- 什么'如果pthread_cond_wait自己这样做,那么锁定和解锁互斥锁的意义就在于什么
- 这个宏语句是合法的C++还是其他什么?如果它是合法的,它是如何运作的