2012-11-29 41 views
2

得到真的卡住了,需要一些建议或实例。使用QMathGL绘制实时数据?

1)我的boost ::线程载体生产线(数据到达快〜每秒100个样本) 2)我想QMathGL画数据到达 3)我不希望我的Qt GUI冻结

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

不用修改QMathGL,我应该尝试什么?

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

回答

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

这只有在呈现renderBatch的工作量少于超时时间的情况下才有效。

2

我强烈建议去计时器。重绘操作成本高昂,我假设没有用户可以实时处理超过10个印刷媒介。所以我不能看到最终用户的真正好处,除了可能显示更新更“顺利”并进入条目。但是用动画可以使这些效果变得更容易;)

当每次数据更改重新绘制时,都会产生您描述的烦人行为。解决这个问题是(imho)不值得麻烦。

+0

两者,答案都是相似的,所以对不起,我给出了那些声誉较低的家伙的答案,你已经有了很多=)。 – Maquefel