2012-11-29 84 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