我们有一个非常多线程的嵌入式Qt应用程序。然而,它的大部分处理是在主线程中完成的(即:first Start),它显然也处理屏幕绘制。对于线程间通信,使用了大量信号/插槽调用。
一切正常,直到CPU负载达到某一点,然后
屏幕停止更新
.导致加载的原因并不重要——更多数据到达、更详细的记录处理、额外的日志记录等。
从日志中,我可以看到主程序循环每秒执行多次,虽然CPU负载很低,但每次迭代都会看到一个widget paint()函数的日志。当负载过高时,我仍然可以看到主循环正在执行,但是没有调用widget paint()函数(屏幕也没有更新)。
这是已知的错误吗?
有什么方法可以进一步调试吗?
有没有办法绝对
武力
屏幕刷新?
我
犯罪嫌疑人
可能是某种信号/插槽处理耗尽了CPU时间。我想象这个信号会以某种方式打断油漆,但在处理完成之前,另一个信号出现了。信号/插槽是这样工作的吗?
编辑:根据@Jeremy Friesner下面的评论,到目前为止我已经尝试过:
// KLUDGE: TRY TO FORCE A REPAINT
// QCoreApplication::postEvent( this, new QEvent(QEvent::UpdateRequest), Qt::HighEventPriority );
QCoreApplication::sendEvent( this, new QEvent(QEvent::UpdateRequest) );
qApp->processEvents();
没用。
编辑2:
还尝试了:
//QCoreApplication::postEvent( this, new QEvent(QEvent::Paint), Qt::HighEventPriority );
QCoreApplication::sendEvent( this, new QEvent(QEvent::Paint) );
qApp->processEvents();