【问题标题】:Use of QMathGL to paint realtime data?使用 QMathGL 绘制实时数据?
【发布时间】:2012-11-29 09:25:46
【问题描述】:

真的卡住了,需要一些建议或真实的例子。

1)我有 boost::thread 向量生产者线程(数据到达速度快~每秒 100 个样本) 2) 我希望 QMathGL 在数据到达时对其进行绘制 3) 我不想让我的 Qt gui 冻结

我试图将 QMathGL::update() 移动到单独的线程 - Qt 认为 QPixmap 不允许在单独的线程中。

在不修改 QMathGL 的情况下我应该尝试什么?

唯一想到的就是在计时器上重绘(fps?),但我不喜欢这个解决方案,如果我错了,请告诉我。

【问题讨论】:

    标签: c++ multithreading qt boost mathgl


    【解决方案1】:

    我强烈建议您使用计时器。重绘操作成本高昂,我假设没有用户可以实际每秒处理超过 10 个打印的矢量。所以我看不到对最终用户的真正好处,除了显示更新更“流畅”和条目输入。但是你可以通过动画更容易地实现这些效果;)

    每次数据更改都重新绘制时,您会遇到您所描述的烦人行为。解决这个问题(恕我直言)不值得麻烦。

    【讨论】:

    • 两者,答案是相似的,所以对不起,我给你已经有很多声誉的人回答=)。
    【解决方案2】:

    我有时也会遇到类似的问题。

    我使用的通常解决方案是缓冲数据并在计时器上重新绘制。这沿着这条线(伪代码):

    void Widget::OnNewData(void *dataSample)
    {
        this->threadSafebuffer->appendData(dataSample);
    }
    void Widget::OnTimeout()
    {
        DataBuffer renderBatch = this->threadSafebuffer->interlockedExchange();
        /* Do UI updates according to renderBatch */
    
    }
    

    这假设 OnNewData 在后台线程上被调用。 OnTimeout 从 UI-EventLoop 上的 QTimer 调用。为了防止争用,它只是将当前缓冲区指针与第二个缓冲区进行互锁交换。因此不需要繁重的同步(例如 Mutext/Semaphore)。

    这只有在渲染渲染批处理的工作量小于超时时才有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-16
      • 1970-01-01
      • 2012-08-17
      • 2012-10-22
      • 2021-09-07
      • 2015-09-15
      • 1970-01-01
      相关资源
      最近更新 更多