代码之家  ›  专栏  ›  技术社区  ›  Kingsley

Qt5嵌入式+帧缓冲区,不在高CPU上绘制。已知问题?

  •  0
  • Kingsley  · 技术社区  · 4 年前

    我们有一个非常多线程的嵌入式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();
    
    0 回复  |  直到 4 年前