得到真的卡住了,需要一些建議或實例。使用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