真的被卡住了,需要一些建议或真实的例子。
1)我有 boost::thread 向量生产者线程(数据快速到达〜每秒 100 个样本)2)我希望 QMathGL 在数据到达时绘制数据 3)我不希望我的 Qt gui 冻结
我试图将 QMathGL::update() 移动到单独的线程 - Qt 认为 QPixmap 不允许在单独的线程中使用。
在不修改 QMathGL 的情况下,我应该尝试什么?
唯一想到的是在计时器上重绘(fps?),但我不喜欢这个解决方案,如果我错了,请告诉我。
真的被卡住了,需要一些建议或真实的例子。
1)我有 boost::thread 向量生产者线程(数据快速到达〜每秒 100 个样本)2)我希望 QMathGL 在数据到达时绘制数据 3)我不希望我的 Qt gui 冻结
我试图将 QMathGL::update() 移动到单独的线程 - Qt 认为 QPixmap 不允许在单独的线程中使用。
在不修改 QMathGL 的情况下,我应该尝试什么?
唯一想到的是在计时器上重绘(fps?),但我不喜欢这个解决方案,如果我错了,请告诉我。
我强烈建议使用计时器。重绘操作成本高昂,我假设没有用户可以实际每秒处理超过 10 个打印的矢量。所以我看不到对最终用户的真正好处,除了显示更新更“流畅”和条目输入。但是你可以通过动画更容易地实现这些效果;)
每次数据更改都重新绘制时,您会得到所描述的烦人行为。解决这个问题(恕我直言)不值得麻烦。
我有时也会遇到类似的问题。
我使用的通常解决方案是缓冲数据并在计时器上重新绘制。这沿着这条线(伪代码):
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)。
这仅在渲染渲染批处理的工作量小于超时时才有效。