小编Ste*_*veC的帖子

在Qt GUI中快速更新许多小部件

我很难理解必须向屏幕显示大量数据的应用程序的最佳方法,该方法正以高速率更新.我正在Qt for windows中编写这个应用程序.我不会详细介绍实际的应用程序,但我在下面编写了一个示例应用程序来演示这个问题.

在这里我有一个计算值的线程.在这种情况下,它只是一个计数器的值.在实际应用中它有很多价值.这是每毫秒更新一次.此速率是数据所需的计算速率,而不是GUI所需的更新速率.如上所述,这是在自己的线程中完成的.这个线程的想法是它只是计算数据,而不关心它的显示.

现在,为了更新此示例中的数据显示,我使用QLabel网格多次显示该值(模拟许多不同值的显示).我从Qt文档中了解到,Widgets的更新必须在主GUI线程中完成.所以我在这里做的是我得到线程计算值,每次重新计算它时发出一个带有计算值的信号(1ms).然后将其连接到主GUI,然后依次更新每个小部件以显示值.

这样做的结论是:

  1. GUI线程被数据线程的1ms更新淹没,因此显示变得非常慢.在我的机器上,有100个小部件更新我估计更新大约是4fps.
  2. GUI的所有其他方面(例如移动,调整大小和按钮按下)都在努力获得处理器时间.
  3. 似乎用文本更新一个简单的QLabel似乎很慢.这是正常的吗?
  4. 我也为此添加了时序代码,GUI线程中的1ms更新在大约1.8ms的avergae上运行,最大增量时间为40-75ms.所以它的运行速度非常快,即使它落后了.但可能在幕后其他事件正在GUI线程事件队列中实际绘制屏幕更新,这些确实很困难.
  5. 我真的不明白什么是确定实际的屏幕更新率?Qt如何决定何时更新屏幕?

最重要的是,我不确定更新要显示的数据的正确方法是什么.很明显,屏幕不需要在1ms更新,即使它可能无论如何都不能快速刷新.另一方面,我不希望我的数据线程与屏幕更新率有关.有没有更好的方法将数据从数据线程获取到GUi而不会淹没GUI事件队列?

任何洞察这个问题的Qt方法都将非常感激.

这是在自己的线程中运行的数据生成器:

class Generator : public QObject
{
    Q_OBJECT
public:
    explicit Generator(QObject *parent = 0);

signals:
    void    dataAvailable(int val);
public slots:
    void    run(bool run);
    void    update(void);
private:
    QTimer  *timer;
    int     value;
};

void Generator::run(bool run)
{
    if(run)
    {
        value = 0;
        timer = new QTimer;
        connect(timer, SIGNAL(timeout()), this, SLOT(update()));
        timer->start(1);
    } else
    {
        timer->stop();
        delete timer;
    }
}

void Generator::update()
{
    value++;
    emit dataAvailable(value);
}
Run Code Online (Sandbox Code Playgroud)

这是更新dislay的主要GUI类:

class MainWindow …
Run Code Online (Sandbox Code Playgroud)

performance user-interface qt multithreading

5
推荐指数
1
解决办法
3589
查看次数

标签 统计

multithreading ×1

performance ×1

qt ×1

user-interface ×1