2017-03-06 73 views
1

Qtが新しく、Qt 5.7でQSplineSeriesを使用してリアルタイムプロットを実装しようとしています。 100msごとに新しいデータが来るのでx軸をスクロールする必要があります。 graphSeriesX-> remove(0)を使用して、シリーズに追加された古いデータをパージしないと、CPU使用率が100%に達するようです。私はx軸をスクロールする2つの方法を見つけました。Qt5チャートでリアルタイムプロットを実装する

const uint8_t X_RANGE_COUNT = 50; 
const uint8_t X_RANGE_MAX = X_RANGE_COUNT - 1; 
qreal y = (axisX->max() - axisX->min())/axisX->tickCount(); 
m_x += y; 
if (m_x > axisX->max()) { 
    axisX->setMax(m_x); 
    axisX->setMin(m_x - 100); 
} 

if (graphSeries1->count() > X_RANGE_COUNT) { 
    graphSeries1->remove(0); 
    graphSeries2->remove(0); 
    graphSeries3->remove(0); 
} 

上記の問題がm_x型QREALであり、私は継続的に実行されているデモを続ける場合は、いくつかの時点で、それはそれはMAX値だ達するとaxisX-> setMaxコールプロットではなくなって失敗するということですもう仕事があります。このユースケースを修正する正しい方法は何でしょうか?それは私にははっきりしていないが

qreal x = plotArea().width()/X_RANGE_MAX; 
chart->scroll(x, 0) 
if (graphSeries1->count() > X_RANGE_COUNT) { 
      graphSeries1->remove(0); 
      graphSeries2->remove(0); 
      graphSeries3->remove(0); 
} 

は、どのように私はgraphSeriesX->は、このシナリオでは(0)の呼び出しを削除することができます。グラフはX_RANGE_COUNTの値が追加されるとグラフが消去され続けますが、ifブロックは常に0番目の値を削除しますが、スクロールは何とかx軸の最大値を手動で設定したり、グラフ。スクロールは削除を呼び出さないが、CPU使用率が100%に達した場合に機能します。

CPU使用率を低く抑えるためにremoveを使用しているときに、スクロールの使い方を正しい方向で指摘できますか?

答えて

0

「x軸の最大値を手動で設定する方法はありません」とはどういう意味ですか? x軸の範囲を0X_RANGE_MAXの間に設定すると、表示された2番目の方法が機能します。これはあなたの後ではありませんか?以下のような

何か:chart->axisX()->setRange(0, X_RANGE_MAX);

1

それはQChartがvoid QXYSeries::replace(QVector<QPointF> points)ているため、データを更新するための最良の方法のように思えます。 documentationから、すべてのデータを消去するよりもはるかに高速です(リストの代わりにベクターを使うことを忘れないでください)。ドキュメントのaudio exampleはそれを正確に示しています。 setMin,setMaxsetRangeで軸を更新すると、多くのCPUが使用されているようです。私はそれがそれを回避する方法であるかどうかを試してみるでしょう。

関連する問題