2

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

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

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

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

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

4

2 回答 2

2

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

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

于 2012-11-29T09:29:08.280 回答
0

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

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

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)。

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

于 2012-11-30T09:35:59.167 回答