得到真的卡住了,需要一些建议或实例。使用QMathGL绘制实时数据?
1)我的boost ::线程载体生产线(数据到达快〜每秒100个样本) 2)我想QMathGL画数据到达 3)我不希望我的Qt GUI冻结
我试图将QMathGL :: update()移动到单独的线程 - Qt认为QPixmap不允许在单独的线程中使用。
不用修改QMathGL,我应该尝试什么?
唯一的想法是重新定时器(fps?),但我不喜欢这个解决方案,请告诉我,如果我错了。
得到真的卡住了,需要一些建议或实例。使用QMathGL绘制实时数据?
1)我的boost ::线程载体生产线(数据到达快〜每秒100个样本) 2)我想QMathGL画数据到达 3)我不希望我的Qt GUI冻结
我试图将QMathGL :: update()移动到单独的线程 - Qt认为QPixmap不允许在单独的线程中使用。
不用修改QMathGL,我应该尝试什么?
唯一的想法是重新定时器(fps?),但我不喜欢这个解决方案,请告诉我,如果我错了。
我有时也会遇到类似的问题。
我使用的通常分辨率是缓冲数据并在定时器上重新绘制。这沿着这(伪码)的行云:
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)。
这只有在呈现renderBatch的工作量少于超时时间的情况下才有效。
我强烈建议去计时器。重绘操作成本高昂,我假设没有用户可以实时处理超过10个印刷媒介。所以我不能看到最终用户的真正好处,除了可能显示更新更“顺利”并进入条目。但是用动画可以使这些效果变得更容易;)
当每次数据更改重新绘制时,都会产生您描述的烦人行为。解决这个问题是(imho)不值得麻烦。
两者,答案都是相似的,所以对不起,我给出了那些声誉较低的家伙的答案,你已经有了很多=)。 – Maquefel